Kombinieren dieser Methode mit Remotedebuggen

Manchmal ist es hilfreich, den Benutzermodusdebugger über den Kerneldebugger zu steuernund den Benutzermodusdebugger gleichzeitig als Debugserver zu verwenden.

Diese Konfiguration ist beispielsweise nützlich, wenn sich Ihre Benutzermodussymbole auf einem Symbolserver befinden. In der Standardkonfiguration zum Steuern des Benutzermodusdebuggers aus einem Kerneldebugger kann die Interaktion der beiden Debugger zu winzigen Synchronisierungsproblemen führen, und diese Fehler können die Symbolserverauthentifizierung verhindern. Die hier beschriebene komplexere Konfiguration kann dieses Problem vermeiden.

Hinweis Bei der Beschreibung dieses Szenarios bezieht sich die Zielanwendung auf die Anwendung im Benutzermodus, die debuggt wird, der Zielcomputer auf den Computer, der die Zielanwendung und den CDB- oder NTSD-Prozess enthält, und der Hostcomputer auf den Computer, der den Kerneldebugger enthält.

Um dieses Verfahren verwenden zu können, müssen Sie die folgenden Schritte ausführen:

  1. Starten Sie NTSD oder CDB auf dem Zielcomputer mit den Befehlszeilenoptionen -ddefer und -server, wobei sie die gewünschten Transportoptionen angeben. Die Option -server muss der erste Parameter in der Befehlszeile sein.

    Beispielsweise können Sie an einen ausgeführten Prozess anfügen, indem Sie die folgende Syntax verwenden.

    ntsd -server ServerTransport -ddefer [-y UserSymbolPath] -p PID 
    

    Alternativ können Sie einen neuen Prozess als Ziel starten, indem Sie die folgende Syntax verwenden.

    ntsd -server ServerTransport -ddefer [-y UserSymbolPath] ApplicationName 
    

    Wenn Sie dies als postmortem-Debugger installieren, verwenden Sie die folgende Syntax. Beachten Sie, dass Sie die Registrierung manuell bearbeiten müssen, um einen postmortem-Debugger zu installieren, der den Parameter -server enthält. Weitere Informationen finden Sie unter Aktivieren des Postmortemdebuggens.

    ntsd -server ServerTransport -ddefer [-y UserSymbolPath] 
    

    Informationen zu den verfügbaren Transportoptionen finden Sie unter Aktivieren eines Debugservers.

  2. Starten Sie WinDbg oder KD auf dem Hostcomputer, als ob Sie den Zielcomputer debuggen würden, aber nicht auf den Zielcomputer einbrechen. Verwenden Sie die folgende Syntax, um WinDbg zu verwenden.

    windbg [-y KernelSymbolPath] [-k ConnectionOptions] 
    

    Weitere Informationen zu diesem Schritt finden Sie unter Live Kernel-Mode Debugging Using WinDbg (Classic)

    .

  3. Starten Sie WinDbg oder CDB als Debugclient mit den gleichen Transportoptionen, die zum Starten des Servers verwendet werden. Dieser Debugclient kann entweder auf dem Hostcomputer oder auf einem dritten Computer ausgeführt werden.

    cdb -remote ClientTransport 
    

    Weitere Informationen zu diesem Schritt finden Sie unter Aktivieren eines Debugclients.

  4. Sobald die Debugger ausgeführt werden und die Input> Eingabeaufforderung im Kerneldebugger angezeigt wird, verwenden Sie den Befehl .sleep (Debugger anhalten), um die Debugger anzuhalten und den Zielcomputer einige Sekunden lang laufen zu lassen. Dadurch erhält der Zielcomputer Zeit zum Verarbeiten des Remotetransportprotokolls, wodurch die Verbindung zwischen dem Remoteserver im Benutzermodus und dem Remoteclient hergestellt wird.

Wenn Sie CDB als Benutzermodusdebugger verwenden, bleibt das Eingabeaufforderungsfenster, das CDB zugeordnet ist, gesperrt und nicht verfügbar, während das Debuggen fortgesetzt wird. Wenn Sie NTSD verwenden, wird kein zusätzliches Fenster erstellt, obwohl NTSD auf dem Zielcomputer über eine Prozess-ID verfügt.

Die vier Modi und die Methoden zum Wechseln zwischen ihnen, die im Thema Wechselmodi beschrieben werden, gelten in diesem Kombinationsszenario mit den folgenden Unterschieden:

  • Es gibt zwei verschiedene Debugmodi für den Benutzermodus. Wenn der Zielcomputer ausgeführt wird, wird der Debugserver wie in jeder anderen Remotedebugsitzung vom Debugclient gesteuert. Dies wird als remotegesteuertes Benutzermodusdebuggen bezeichnet. Wenn der Kernelmodusdebugger auf dem Zielcomputer unterbrochen wird und die Input> Eingabeaufforderung angezeigt wird, wird der Benutzermodusdebugger vom Kerneldebugger gesteuert. Dies wird als kernelgesteuertes Benutzermodusdebuggen bezeichnet.

  • Diese beiden Modi sind nie gleichzeitig verfügbar. Wenn der Kerneldebugger auf dem Zielcomputer unterbrochen wird, obwohl der Benutzermodusdebugger möglicherweise aktiv ist, kann der Zielcomputer das Remotetransportprotokoll nicht verarbeiten, sodass der Benutzermodusdebugger keine Remoteeingaben über diese Verbindung empfangen kann.

  • Wenn sich Ihre Benutzermodussymbole auf einem Symbolserver befinden, sollten alle Debuggerbefehle, die Symbolzugriff erfordern, im remote gesteuerten Benutzermodus-Debugmodus ausgegeben werden.

  • Um vom kernelgesteuerten Benutzermodusdebuggen zum remotegesteuerten Benutzermodusdebuggen zu wechseln, verwenden Sie den Befehl .sleep (Debugger anhalten). Wenn der Benutzermodusdebugger über den Standbybefehl reaktiviert wird, befindet er sich im remote gesteuerten Benutzermodus-Debugmodus.

  • Um vom remotegesteuerten Benutzermodusdebuggen zum Kernelmodusdebuggen zu wechseln, geben Sie einen beliebigen Befehl über die Input> Eingabeaufforderung ein. Wenn diese Eingabeaufforderung nicht angezeigt wird, wechseln Sie zum Debuggen im Kernelmodus, und verwenden Sie dann den Befehl g (Go) an der kd> Eingabeaufforderung.

Intern erhält ein mit -ddefer gestarteter Benutzermodusdebugger die erste Priorität für Eingaben vom Debugclient und die zweite Priorität für Eingaben aus dem Kerneldebugger. Es kann jedoch nie zu einem Konflikt zwischen gleichzeitigen Eingaben kommen, da die Remoteverbindung nicht verfügbar ist, wenn der Kerneldebugger auf dem Zielcomputer eingebrochen ist.