Windbg Hilfe - Wie kann ich den Code in diesem Callstack lesen?

8

Ich habe einen Dump von einem Windows-Dienst, den ich gemacht habe. Die Ausnahme ist, dass mein Code eine Datei nicht verschieben kann (aus irgendeinem Grund). Nun, in meinem Code gibt es eine Reihe von Orten, an denen ich Dateien um das Dateisystem herum verschiebe. Mit Windbg versuche ich den Code zu sehen, wo die Ausnahme auftritt.

Hier ist mein! Clrstack Dump ..

%Vor%

Das hilft jetzt sehr ...

%Vor%

Ich habe also herausgefunden, dass die Datei nicht verschoben wurde. Kewl. Aber ich möchte nur den Code in dieser Methode MyClass.Foo.DoSomeStuffInHere (System.String) sehen, die File.Move (..) aufruft. Diese Methode hat viele File.Move .. so könnte ich versuchen / catchs / debug / trace Informationen .. aber ich hoffe, effizienter zu sein mit Windbg, um dieses Problem zu finden.

Irgendwelche Gedanken?

    
Pure.Krome 30.10.2008, 12:26
quelle

2 Antworten

3

Sie können die genaue Codezeile nicht abrufen, es sei denn, die Anwendung wurde im Debugmodus implementiert. Und wenn das der Fall wäre, glaube ich, dass es sie im! Clstack Call zeigen würde.

    
TheSoftwareJedi 31.10.2008, 01:28
quelle
3

Dies ist ein schwieriges Problem, und es kann erforderlich sein, außerhalb der Komfortzone des verwalteten Debuggens zu arbeiten.

Was Sie tun möchten, ist die IL für die Funktion MyClass.Foo.DoSomeStuffInHere auf die Demontage dieser Funktion abzubilden. Mein Beispiel unten ist x86 aber x64 kann die gleichen Schritte folgen.

Dies ist tief unten in der folgenden Verbindung referenziert. Debuggen eines unerwarteten Prozessendes

Beispieltext aus dem Whitepaper: Im verwalteten Stapel Debugging.Unexpected.btnSTA_Click ... Sehen Sie sich den Code im Debugging.Unexpected.btnSTA_Click-Ereignis an.

%Vor%

Wenn der Quellcode nicht verfügbar ist, können Sie die Assembly untersuchen, indem Sie den Anweisungszeiger für den Call-Stack-Frame an den ! u-Befehl übergeben. Der Befehlszeiger kann aus dem! Clrstack: output abgerufen werden.

%Vor%

Um diese Funktion zu zerlegen, geben Sie ! u 03a00e06 ein.

%Vor%

Ok, was jetzt?
Scannen Sie Ihre eigene Ausgabe für eine Zeile wie

%Vor%

Sie können auch ip2md 03a00e06 ausführen, um MethodDesc abzurufen, und dann ! dumpil ausführen, um den IL-Code zu untersuchen, falls das einfacher ist.

Sie können die Anzahl der Aufrufe von System.IO.File.Move in der ! u-Ausgabe zählen und dann die gleiche Zahl in der IL herunterzählen. Dann können Sie mit .NET Reflector die Methode zerlegen und das C # auf IL abbilden und das Ergebnis vergleichen.

Viele Schritte, aber es würde Sie zum selben Ergebnis bringen: -)

Danke, Aaron

    
AaronBa 21.02.2009 23:14
quelle

Tags und Links