Debuggen eines Benutzermodusprozesses mit CDB
Sie können CDB verwenden, um an einen laufenden Prozess anzufügen oder zu spawnen und an neuen Prozess anzufügen.
Anfügen an einen laufenden Prozess
Eingabeaufforderung
In einem Eingabeaufforderungsfenster können Sie beim Starten von CDB an einen ausgeführten Prozess anfügen. Verwenden Sie einen der folgenden Befehle:
- cdb -p ProcessID
- cdb -pn ProcessName
Dabei ist ProcessID die Prozess-ID eines ausgeführten Prozesses oder ProcessName der Name eines ausgeführten Prozesses.
Weitere Informationen zur Befehlszeilensyntax finden Sie unter CDB-Befehlszeilenoptionen.
CDB-Befehlsfenster
Wenn der Debugger bereits einen oder mehrere Prozesse debugt, können Sie eine Verbindung mit einem ausgeführten Prozess herstellen, indem Sie den Befehl ".attach to Process" verwenden.
Der Debugger startet immer mehrere Zielprozesse gleichzeitig, es sei denn, einige ihrer Threads werden fixiert oder angehalten.
Wenn der Befehl ".attach " erfolgreich ist, wird der Debugger beim nächsten Ausbringen eines Ausführungsbefehls an den angegebenen Prozess angefügt. Wenn Sie diesen Befehl mehrmals in einer Zeile verwenden, muss die Ausführung vom Debugger so oft angefordert werden, wie Sie diesen Befehl verwenden.
Anfügen an einen laufenden Prozess, der nicht invasiv ist
Wenn Sie einen ausgeführten Prozess debuggen und nur minimal in der Ausführung stören möchten, sollten Sie den Prozess nicht invasiv debuggen.
Eingabeaufforderung
Wenn Sie einen laufenden Prozess nicht über die Befehlszeile des CDB debuggen möchten, geben Sie in der folgenden Syntax die Option -pv , die Option -p und die Prozess-ID an.
cdb -pv -p ProcessID
Oder verwenden Sie zum nichtinvasiven Debuggen eines ausgeführten Prozesses durch Angeben des Prozessnamens stattdessen die folgende Syntax.
cdb -pv -pn ProcessName
Es gibt mehrere weitere nützliche Befehlszeilenoptionen. Weitere Informationen zur Befehlszeilensyntax finden Sie unter CDB-Befehlszeilenoptionen.
CDB-Befehlsfenster
Wenn der Debugger bereits aktiv ist, können Sie einen laufenden Prozess nicht invasiv debuggen, indem Sie den Befehl ".attach -v" (An Prozess anhängen) eingeben.
Sie können den Befehl ".attach" verwenden, wenn der Debugger bereits einen oder mehrere Prozesse invasiv debuggen soll.
Wenn der Befehl ".attach -v " erfolgreich ist, debugt der Debugger den angegebenen Prozess, wenn der Debugger das nächste Mal einen Ausführungsbefehl ausgibt. Da die Ausführung während des nicht invasiven Debuggens nicht zulässig ist, kann der Debugger nicht mehrere Prozesse gleichzeitig debuggen. Diese Einschränkung bedeutet auch, dass die Verwendung des Befehls ".attach -v " eine vorhandene invasive Debugsitzung weniger nützlich macht.
Spawning eines neuen Prozesses
CDB kann eine Benutzermodusanwendung starten und dann die Anwendung debuggen. Die Anwendung wird anhand des Namens angegeben. Der Debugger kann auch automatisch an untergeordnete Prozesse angefügt werden (zusätzliche Prozesse, die der ursprüngliche Zielprozess gestartet hat).
Prozesse, die der Debugger erstellt (auch als Spawned-Prozesse bezeichnet), verhalten sich geringfügig anders als Prozesse, die der Debugger nicht erstellt.
Anstatt die standardmäßige Heap-API zu verwenden, verwenden Prozesse, die der Debugger erstellt, einen speziellen Debug-Heap. Sie können einen Spawned-Prozess erzwingen, um den Standard-Heap anstelle des Debug-Heaps zu verwenden, indem Sie die _NO_DEBUG_HEAP Umgebungsvariable oder die Befehlszeilenoption -hd verwenden.
Da die Zielanwendung ein untergeordneter Prozess des Debuggers ist, erbt sie auch die Berechtigungen des Debuggers. Mit dieser Berechtigung kann die Zielanwendung bestimmte Aktionen ausführen, die andernfalls nicht ausgeführt werden konnten. Die Zielanwendung kann sich beispielsweise auf geschützte Prozesse auswirken.
In einem Eingabeaufforderungsfenster können Sie beim Starten von CDB einen neuen Prozess erstellen. Geben Sie den folgenden Befehl ein.
cdb [-o] ProgramName [Arguments]
Die Option "-o " bewirkt, dass der Debugger an untergeordnete Prozesse angefügt wird. Es gibt mehrere weitere nützliche Befehlszeilenoptionen. Weitere Informationen zur Befehlszeilensyntax finden Sie unter CDB-Befehlszeilenoptionen.
Wenn der Debugger bereits einen oder mehrere Prozesse debugt, können Sie einen neuen Prozess erstellen, indem Sie den Befehl .create (Create Process) eingeben.
Der Debugger startet immer mehrere Zielprozesse gleichzeitig, es sei denn, einige ihrer Threads werden fixiert oder angehalten.
Wenn der .create-Befehl erfolgreich ist, erstellt der Debugger den angegebenen Prozess, wenn der Debugger das nächste Mal einen Ausführungsbefehl ausgibt. Wenn Sie diesen Befehl mehrmals in einer Zeile verwenden, muss die Ausführung vom Debugger so oft angefordert werden, wie Sie diesen Befehl verwenden.
Sie können das Startverzeichnis der Anwendung steuern, indem Sie den Befehl .createdir (Set Created Process Directory) vor .create verwenden. Sie können den Befehl ".createdir-I " oder die Befehlszeilenoption "-noinh " verwenden, um zu steuern, ob die Zielanwendung die Handles des Debuggers erbt.
Sie können das Debuggen untergeordneter Prozesse aktivieren oder deaktivieren, indem Sie den Befehl ".childdbg" (Debug Child Processes) verwenden.
Erneutes Anattacken auf einen Prozess
Wenn der Debugger nicht mehr reagiert oder eingefroren ist, können Sie einen neuen Debugger an den Zielprozess anfügen. Weitere Informationen zum Anfügen eines Debuggers in dieser Situation finden Sie unter "Erneutes Anfügen an die Zielanwendung".