13 Stimmen

Debugging von Daten in 'anonymen Namensräumen' (C++)

Vor kurzem erhielt ich von einem Kunden eine Crash-Dump-Datei. Ich konnte das Problem auf eine Klasse zurückführen, die fehlerhafte Daten enthalten könnte, aber ich erhielt nur einen void-Zeiger auf die Klasse, keinen echten Zeiger (der void-Zeiger stammte von einer Window-Property, daher war es ein void-Zeiger). Leider befand sich die Klasse, auf die ich den Zeiger casten wollte, in einem anonymen Namespace, wie hier:

namespace
   {
   class MyClass
      {
      ...
      };
   }

...
void *ptr = ...
// I know ptr points to an instance of MyClass,
// and at this location I want to cast ptr to (MyClass *) in the debugger.

Wenn ich die ptr im Überwachungsfenster, zeigt Visual Studio 2005 nur den Zeigerwert an. Wenn ich (MyClass *)ptr sagt mir der Debugger, dass er nicht darauf zugreifen kann.

Wie kann ich die ptr zu einer MyClass Zeiger?

Hinweis: Ich könnte eventuell einen Namensraum mit einem dummen Namen verwenden (wie den Namen der Quelldatei) und dann einen "using namespace" verwenden, aber ich würde bessere Lösungen erwarten.

10voto

Sumudu Fernando Punkte 1763

Dies wird erwähnt in MSDN . Es sieht nicht so aus, als gäbe es eine schöne Lösung im Watch-Fenster (Sie können den dekorierten Namen Ihrer Klasse aus einer Auflistung abrufen, denke ich).

Ihre "albern benannten Namespace"-Idee würde funktionieren, Sie könnten auch nur eine identische Klasse mit einem albernen Namen deklarieren und stattdessen auf diesen Typ casten.

3voto

Glen Knowles Punkte 398

Der Verweis auf anonyme Namespaces in den Ausdrücken des Visual Studio Debugger wird nicht unterstützt (zumindest ab VS 2017) und ist wirklich ärgerlich.

Desde https://docs.microsoft.com/en-us/visualstudio/debugger/expressions-in-the-debugger#c-expressions

Anonyme Namespaces werden nicht unterstützt. Wenn Sie den folgenden Code haben, können Sie nicht hinzufügen Test zum Uhrenfenster:

namespace mars
{   
    namespace  
    {  
        int test = 0;   
    }   
}   
int main()   
{   
    // Adding a watch on test does not work.   
    mars::test++;   
    return 0;   
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X