Steuern von Prozessen und Threads
Wenn Sie das Debuggen im Benutzermodus ausführen, aktivieren, anzeigen, fixieren, aufheben, anhalten und nicht eingestellte Prozesse und Threads.
Der aktuelle oder aktive Prozess ist der Prozess, der derzeit gedebuggt wird. Ebenso ist der aktuelle oder aktive Thread der Thread, den der Debugger derzeit steuert. Die Aktionen vieler Debuggerbefehle werden durch die Identität des aktuellen Prozesses und Threads bestimmt. Der aktuelle Prozess bestimmt auch die virtuellen Adresszuordnungen, die der Debugger verwendet.
Wenn das Debuggen beginnt, ist der aktuelle Prozess der Prozess, an den der Debugger angefügt ist oder der die Ausnahme verursacht hat, die in den Debugger aufgetreten ist. Ebenso ist der aktuelle Thread der, der aktiv war, als der Debugger an den Prozess angefügt wurde oder der die Ausnahme verursacht hat. Sie können den Debugger jedoch verwenden, um den aktuellen Prozess und thread zu ändern und einzelne Threads einzufrieren oder die Sperre aufzuheben.
Beim Debuggen im Kernelmodus werden Prozesse und Threads nicht durch die methoden gesteuert, die in diesem Abschnitt beschrieben werden. Weitere Informationen dazu, wie Prozesse und Threads im Kernelmodus bearbeitet werden, finden Sie unter Ändern von Kontexten.
Anzeigen von Prozessen und Threads
Um Prozess- und Threadinformationen anzuzeigen, können Sie die folgenden Methoden verwenden:
| (Prozessstatus) Befehl
Der Befehl ~ (Threadstatus)
(Nur WinDbg) Fenster "Prozesse und Threads"
Festlegen des aktuellen Prozesses und Threads
Um den aktuellen Prozess oder Thread zu ändern, können Sie die folgenden Methoden verwenden:
Der Befehl |s (Aktuellen Prozess festlegen)
Der Befehl ~s (Aktuellen Thread festlegen)
(Nur WinDbg) Fenster "Prozesse und Threads"
Fixieren und Anhalten von Threads
Der Debugger kann die Ausführung eines Threads ändern, indem er den Thread angehalten oder den Thread einfriert . Diese beiden Aktionen haben etwas unterschiedliche Auswirkungen.
Jedem Thread ist eine Anhalteanzahl zugeordnet. Wenn diese Anzahl ein oder größer ist, führt das System den Thread nicht aus. Wenn die Anzahl null oder niedriger ist, führt das System ggf. den Thread aus.
In der Regel weist jeder Thread die Anzahl der Unterbrechungen auf 0 (null) auf. Wenn der Debugger an einen Prozess angefügt wird, erhöht er die Anzahl der Anhaltevorgänge aller Threads in diesem Prozess um eins. Wenn der Debugger vom Prozess getrennt wird, verringert er alle Anhalteanzahlen um eins. Wenn der Debugger den Prozess ausführt, verringert er vorübergehend alle Anhalteanzahlen um eins.
Sie können die Anzahl der Anhaltevorgänge eines beliebigen Threads über den Debugger mithilfe der folgenden Methoden steuern:
Mit dem Befehl ~n (Thread anhalten) wird die Anzahl der Unterbrechungen des angegebenen Threads um eins erhöht.
Der Befehl ~m (Resume Thread) verringert die Anzahl der Unterbrechungen des angegebenen Threads um eins.
Die häufigste Verwendung für diese Befehle besteht darin, die Anzahl der Unterbrechungen eines bestimmten Threads von eins auf zwei zu erhöhen. Wenn der Debugger ausgeführt oder vom Prozess getrennt wird, verfügt der Thread über eine Anhalteanzahl von 1 und bleibt angehalten, auch wenn andere Threads im Prozess ausgeführt werden.
Sie können Threads auch dann anhalten, wenn Sie nichtinvasives Debuggen ausführen.
Der Debugger kann auch einen Thread fixieren . Diese Aktion ähnelt in gewisser Weise dem Anhalten des Threads. "frozen" ist jedoch nur eine Debuggereinstellung. Nichts im Windows-Betriebssystem erkennt, dass sich etwas in diesem Thread unterscheidet.
Standardmäßig sind alle Threads nicht infroziert. Wenn der Debugger bewirkt, dass ein Prozess ausgeführt wird, werden Threads, die fixiert sind, nicht ausgeführt. Wenn der Debugger jedoch vom Prozess getrennt wird, heben alle Threads die Fixierung auf.
Zum Fixieren und Aufheben des Fixierens einzelner Threads können Sie die folgenden Methoden verwenden:
Der Befehl ~f (Freeze Thread) friert den angegebenen Thread ein.
Der Befehl ~u (Unfreeze Thread) hebt die Freeze für den angegebenen Thread auf.
In jedem Fall werden Threads, die zum Zielprozess gehören, nie ausgeführt, wenn der Debugger in das Ziel zerbrochen ist. Die Anzahl der Unterbrechungen eines Threads wirkt sich nur auf das Verhalten des Threads aus, wenn der Debugger den Prozess ausführt oder trennt. Die fixierte status wirkt sich nur auf das Verhalten des Threads aus, wenn der Debugger den Prozess ausführt.
Threads und Prozesse in anderen Befehlen
Sie können Threadspezifizierer oder Prozessspezifizierer vor vielen anderen Befehlen hinzufügen. Weitere Informationen finden Sie in den einzelnen Befehlsthemen.
Sie können den Qualifizierer ~e (threadspezifischer Befehl) vor vielen Befehlen und Erweiterungsbefehlen hinzufügen. Dieser Qualifizierer bewirkt, dass der Befehl in Bezug auf den angegebenen Thread ausgeführt wird. Dieser Qualifizierer ist besonders nützlich, wenn Sie einen Befehl auf mehrere Threads anwenden möchten. Der folgende Befehl wiederholt beispielsweise den Erweiterungsbefehl !gle für jeden Thread, der gedebuggt wird.
~*e !gle
Mehrere Systeme
Der Debugger kann mehrere Ziele gleichzeitig anfügen. Wenn diese Prozesse Speicherabbilddateien enthalten oder Liveziele auf mehr als einem Computer einschließen, verweist der Debugger für jede Aktion auf ein System, einen Prozess und einen Thread. Weitere Informationen zu dieser Art des Debuggens finden Sie unter Debuggen mehrerer Ziele.