Kann Windbg Thread-Namen anzeigen?

8

Windbg sollte das MS Exception-Protokoll um Thread-Namen an einen Debugger zu übergeben.

Ich kann das nicht zur Arbeit bringen. Im Netz gibt es viele Beispiele, die "~" Thread-Listen ohne Thread-Namen zeigen, und das sehe ich. Ich debugge ein .NET x86-Prozess, und ich habe versucht, die WDK 8.1 x86 und x64-Versionen von Windbg.

Weiß jemand, ob diese Funktion noch verfügbar ist? Was vermisse ich?

    
Nick Westgate 22.07.2015, 06:15
quelle

2 Antworten

8

Bei .NET-Threads funktioniert das Folgende für "normal" Thread s (manuell erstellte Threads, da ich keine Möglichkeit kenne, Threadpool-Threads zu benennen):

A Thread ist eine Klasse und kann daher im verwalteten .NET-Heap gefunden werden:

%Vor%

Beachten Sie, dass es auch andere Ausgaben gibt, da !dumpheap nach Teilen von Klassennamen sucht. Die Methodentabelle (MT) identifiziert jedoch eine Klasse eindeutig, also verwenden wir von jetzt an:

%Vor%

Dies sind die Adressen von Thread -Objekten. Da es saubere Ausgabe ist, können wir es in einer Schleife verwenden:

%Vor%

Innerhalb der Schleife können wir die Adresse verwenden, um weitere Informationen über den Thread zu erhalten. Lassen Sie uns zuerst herausfinden, wie ein Thread intern aussieht:

%Vor%

Bei Offset +0xC (abhängig von der Bitness!) gibt es das m_Name -Member. Das ist eine Zeichenfolge. Lassen Sie uns herausfinden, wie eine Zeichenfolge aussieht:

%Vor%

Also, das erste Zeichen der Zeichenkette hat den Offset +0x08 . Zeichenfolgen in .NET sind Unicode, daher können wir sie mit du :

anzeigen %Vor%

Kombinieren Sie all dieses Wissen in einem einzigen Befehl:

%Vor%

(für die Lesbarkeit formatiert, lege alles in eine Zeile)

Wenn Sie das versuchen, werden Sie vielleicht etwas wie

ausgeben %Vor%

Dies passiert, wenn m_Name ist null . Wenn Sie sich darum kümmern, können Sie eine Überprüfung auf Null hinzufügen:

%Vor%

(für die Lesbarkeit formatiert, lege alles in eine Zeile)

Weitere Verbesserungen:

  • mache dasselbe für die Thread-ID
  • Ausgabe prettify (benutze .printf anstelle von dd und du )

Endergebnis:

%Vor%     
Thomas Weller 22.07.2015, 20:50
quelle
0
  

Weiß jemand, ob diese Funktion noch verfügbar ist?

Ja, diese Funktion ist noch verfügbar. Zumindest für native Anwendungen.

Für .NET-Apps aus: Gewusst wie: Festlegen eines Thread-Namens im verwalteten Code "Vielleicht ist es vorzuziehen, eine Ausnahme auszulösen."

    
kernel-panic 22.07.2015 15:52
quelle

Tags und Links