Wie kann ich WinDbg lernen? (Betreff: scheinbar einfacher aufgehängter Prozess)

7

Ich versuche herauszufinden, warum ein Prozess aufhört und lerne über verschiedene Tools wie Process Explorer , < a href="http://en.wikipedia.org/wiki/Process_Monitor"> Prozessmonitor und WinDbg .

Wie auch immer, ich versuche, WinDbg zu verwenden und nach dem Anhängen an meinen Prozess sagt der Debugger dies:

%Vor%

Wenn ich !analyze -v ausführen, wird Folgendes angezeigt:

%Vor%

Ich bin ein Softwareentwickler (VB.NET / C #) ohne Erfahrung in dieser Ebene des Debuggens, also bin ich mir nicht sicher, was ich mache, aber es scheint, als ob WinDbg mit meinem Prozess verbunden ist und dann sofort brechen. Dann, wenn ich eine Analyse mache, denkt es, dass der Breakpoint (den er gerade gesetzt hat) das Problem mit der Anwendung ist?

Wie soll ich WinDbg verwenden, um einfach an einen Prozess anzuhängen und ihn zu analysieren?

(Gibt es auch irgendwelche guten Bücher / Tutorials, um mit dieser Stufe des Debuggens und WinDbg zu beginnen?)

    
SofaKng 18.10.2010, 17:30
quelle

4 Antworten

9

WinDbg ist ein Debugger für den Benutzer und den Kernel-Modus, versteht aber verwalteten Code nicht wirklich und daher ist der Befehl !analyze nur von begrenztem Nutzen. Wenn Sie verwaltete Anwendungen mit WinDbg debuggen möchten, benötigen Sie eine Möglichkeit, WinDbg die internen Strukturen von verwaltetem Code verständlich zu machen. Es gibt eine Reihe von Erweiterungs-DLLs, die dies ermöglichen. Das .NET Framework wird mit sos.dll ausgeliefert und es gibt Downloads wie psscor2 .dll und sosex.dll .

SOS und PSSCOR2 bieten mehr oder weniger die gleichen Funktionen, während SOSEX neue Funktionen für das verwaltete Debugging hinzufügt. Hilfedateien für jeden von diesen sind verfügbar von WinDbg. Z.B. Um die Hilfe für SOS zu erhalten, können Sie den Befehl !sos.help verwenden.

Sie müssen entweder SOS oder PSSCOR2 und möglicherweise SOSEX laden, um eine verwaltete Anwendung mit WinDbg zu debuggen. Z.B. Wenn Sie SOS laden möchten, verwenden Sie den Ladebefehl wie folgt

.loadby sos clr

Dadurch wird SOS vom Speicherort der .NET-Laufzeit geladen. Beachten Sie, dass die Laufzeit in Silverlight mscorwks in .NET 2 und coreclr genannt wird. Wenn Sie also eine dieser Methoden verwenden, müssen Sie den Befehl .loadby entsprechend ändern.

WinDbg benötigt Symbole, um zusätzliche Informationen anzuzeigen. Dies ist besonders wichtig für nicht verwalteten Code. Sie können den Befehl .symfix verwenden, damit WinDbg Symbole bei Bedarf vom Microsoft-Symbolserver abrufen kann.

Da Ihre Anwendung blockiert ist, besteht eine gute Chance, dass Sie einen oder mehrere blockierte Threads haben. Sie können verwaltete Threads mit dem Befehl !threads (oder nur !t ) anzeigen. In .NET werden einfache Sperren intern über eine Struktur namens SyncBlocks implementiert. Sie können diese mit dem Befehl !syncblk anzeigen. Wenn Sie SOSEX geladen haben, kann der Befehl !dlk automatisch Deadlocks erkennen.

Wenn Sie mehr Informationen wünschen, gibt es ein paar Bücher und einige Blogs zum Lesen.

Bücher:

Blogs:

  • Tess Blog ist großartig. Es hat zahlreiche Tutorials und Labs, die Sie zum Üben verwenden können.
  • Toms Blog ist auch sehr nützlich.

Videos:

  • Ich habe eine Präsentation zum Managed Debugging im Microsoft-Entwicklungszentrum in Dänemark gehalten. Videos sind auf Kanal p verfügbar. Teil 1 und Teil 2 .
Brian Rasmussen 19.10.2010, 04:06
quelle
5

Tess Ferrandez Blog ist eine fantastische Ressource für .NET WinDbg Material:

  

Wenn es kaputt ist, beheben Sie es, sollten Sie

Obwohl viele ihrer Artikel auf den Absturz von IIS / ASP.NET-Arbeitsprozessen, auf Hänge und auf Lecks abzielen, können die meisten Techniken auf alle möglichen Szenarien angewendet werden.

    
Kev 18.10.2010 17:35
quelle
5

Erweitertes Windows-Debugging wäre ein guter Anfang.

Wenn Windbg an einen Prozess angehängt wird, injiziert es einen Thread, der DbgBreakPoint aufruft. Das siehst du. Sie können ~ verwenden, um laufende Threads anzuzeigen, und dann ~ n, um zu einem anderen Thread zu wechseln. k gibt Ihnen einen Stack-Trace des aktuellen Threads, der Ihnen eine Vorstellung von dem Hang geben sollte.

    
Michael 18.10.2010 17:38
quelle
3

Die int 3-Anweisung (cc in binary) ist eine der Möglichkeiten, wie Debugger Breakpoints in einer Anwendung setzen. Dieser Befehl erzeugt einen Interrupt, der die Ausführung des Programms unterbricht und dem Debugger die Möglichkeit gibt, auf diesen Interrupt zu reagieren. Sie müssen nur auswählen, dass die Ausführung fortgesetzt wird, bis Sie den Ort erreichen, an dem Ihr Programm hängt.

    
Mario 18.10.2010 17:42
quelle

Tags und Links