Wie finde ich den Handle-Besitzer aus einem Hang Dump mit windbg?

8

Wie finde ich heraus, welcher Thread der Besitzer meines Ereignis-Handle in windbg ist:

Ich renne

%Vor%

und hole

%Vor%

zurück, und da es keinen Namen gibt, habe ich nicht herausgefunden, wie ich den Besitzer dazu bringen kann, zu beweisen, auf welchen Thread mein Thread wartet

[Bearbeiten] Ich muss gegen einen Speicherabzug arbeiten, da der ursprüngliche Prozess auf dem Benutzercomputer neu gestartet werden muss, so dass eine Live-Sitzung nicht debuggt werden kann

Die beste Diskussion über das Thema, die ich bisher gefunden habe, ist auf diesem Blog , aber leider Am Ende benutzen wir verschiedene Lock-Methoden (ich benutze WaitForMultipleObjectsEx und die Beschreibung ist für WaitForSingleObject), und er scheint Zugang zu einem Live-Prozess zu haben.

Der Stacktrace meines Threads (derjenige, der auf etwas blockiert ist und wo ich nach dem aktuellen Besitzer suche) ist:

%Vor%     
Oskar 22.01.2009, 17:08
quelle

4 Antworten

2

Mit Blick auf den Callstack scheint der fragliche Stack einen ReaderWriterLock-Sperrmechanismus zu verwenden.

%Vor%

Wechseln Sie zu Thread 9 und verwenden Sie sos.dll , um ! Dso auszuführen, um das verwaltete ReaderWriterLock-Objekt auszugeben. Dann führe das auf dem ReaderWriterLock-Objekt aus. Ich glaube, dass es ein eigenes Thread-Feld gibt, das Sie abfragen können. Ich werde es testen und sehen.

Die alte Methode, dies zu ermitteln, besteht darin, ~ * e! Clrstack auszuführen und alle verwalteten Threads zu untersuchen, die auf eine Readerwriter-Sperre warten, und dann zu sehen, ob Sie den Thread finden, der denselben Thread eingegeben hat Funktion aber durch das Schloss (dh verschiedene Offset)

Vielen Dank, Aaron

Hinweis: Nicht sicher, ob es eine Möglichkeit gibt, Posts zu verlinken, aber diese ist sehr ähnlich zu Wie finde ich den Lockholder (Reader) meines ReaderWriterLock in windbg

    
AaronBa 22.02.2009 00:23
quelle
1

Verwenden Sie den Befehl !htrace , um die Thread-ID abzurufen. Sie müssen zuerst, möglicherweise zu Beginn des Programms, die Sammlung von Spuren mit !htrace -enable aktivieren.

%Vor%

Die obige Ausgabe ist fiktiv, es wird für Ihr System anders sein. Aber es gibt Ihnen die Information, die Sie brauchen - die Thread-ID (in meinem Beispiel 0x00000b48).

  

Ich muss gegen eine Müllkippe arbeiten als die   Der ursprüngliche Prozess muss neu gestartet werden   auf dem Benutzer-Rechner, kann also nicht debuggen   Live-Sitzung.

Ich bin mir nicht 100% sicher, aber ich denke, das wird funktionieren:

  1. An den Prozess anhängen und !htrace -enable ausführen
  2. Trennen Sie sich vom Prozess mit qd . Die ausführbare Datei wird fortgesetzt.
  3. Sie können jetzt eine Dump-Datei erstellen und den obigen Befehl verwenden - ich denke, Sie werden die beschriebenen Ergebnisse haben.
Jorge Ferreira 19.08.2009 16:24
quelle
0

Sie können das aus einem Kernel-Dump herausholen.

Nun, was das Kernel-Debugging angeht, sollte LiveKd von sysinternals ausreichen, aber leider ist es nur auf einem laufenden System verwendbar.

Es gibt auch einen Speichererfassungs-Tool im Kernel-Modus , das nützlich sein könnte, um einen Dump mit (statt dessen) für eine spätere Inspektion zu machen.

Andernfalls wird die Handle-Traceerstellung (! htrace -enable) und (wenn der Code für einen bestimmten Thread eindeutig ist) aktiviert, und die Handle-Eigentümerschaft könnte aus einer Stack-Ablaufverfolgung geschlossen werden.

    
deemok 22.01.2009 17:43
quelle
0

Hier ist die definitive Antwort, die ich gefunden habe. Ich habe es nie versucht. Sie benötigen Live-Debugging, um den Besitzer zu ermitteln. Aber es ist ziemlich schnell. Ссылка

    
Gopi 23.11.2010 11:34
quelle

Tags und Links