Freigeben über


Aktivieren des Debuggens eines UMDF-Treibers

Sie können die folgenden Konfigurationen verwenden, um einen UMDF-Treiber (User-Mode Driver Framework) während der Entwicklung zu debuggen. Alle Konfigurationen umfassen zwei Computer, einen Host und ein Ziel.

  • Kopieren Sie den Treiber manuell in das Ziel. Führen Sie das Debuggen im Benutzermodus auf dem Ziel aus. In diesem Szenario fügen Sie manuell an eine instance des Treiberhostprozesses an, der auf dem Ziel ausgeführt wird.
  • Kopieren Sie den Treiber manuell auf das Ziel, und führen Sie dann das Debuggen im Kernelmodus vom Host aus.

Es wird empfohlen, alle UMDF-Treibertests und -Entwicklung mit einem angefügten Kerneldebugger durchzuführen.

Bewährte Methoden

Es wird empfohlen, alle UMDF-Treibertests mit einem angefügten Kerneldebugger durchzuführen.

Die folgenden Einstellungen werden empfohlen. Sie können diese manuell festlegen oder das Tool WDF Verifier Control Application (WDFVerifier.exe) im WDK verwenden, um diese Einstellungen anzuzeigen oder zu ändern.

  • Aktivieren Sie die Anwendungsüberprüfung auf WUDFHost.exe:

    AppVerif –enable Heaps Exceptions Handles Locks Memory TLS Leak –for WudfHost.exe
    

    Wenn Ausnahmen auftreten, sendet Application Verifier Diagnosemeldungen an den Debugger und bricht ein.

  • Wenn Sie eine Debugsitzung im Kernelmodus verwenden, legen Sie HostFailKdDebugBreak so fest, dass der Reflektor in den Kernelmodusdebugger einbricht, bevor der Treiberhostprozess beendet wird. Diese Einstellung ist ab Windows 8 standardmäßig aktiviert.

  • Deaktivieren Sie das Pooling, indem Sie UmdfHostProcessSharing auf ProcessSharingDisabled festlegen. Weitere Informationen finden Sie unter Angeben von WDF-Direktiven in INF-Dateien.

  • Wenn ein UMDF-Gerät ausfällt, versucht das Framework standardmäßig, es bis zu fünfMal neu zu starten. Sie können den automatischen Neustart deaktivieren, indem Sie DebugModeFlags auf 0x01 festlegen. Weitere Informationen finden Sie unter Registrierungswerte zum Debuggen von WDF-Treibern.

  • Starten Sie den Computer neu.

  • Informationen zum Debuggen von UMDF-Treiberproblemen finden Sie unter Ermitteln, warum der Reflektor den Hostprozess beendet hat , und Debuggen von UMDF-Treiberabstürzen

Verwenden von WinDbg zum manuellen Anfügen (Debuggen im Benutzermodus)

Auf dem Zielcomputer können Sie WinDbg manuell an die instance von WUDFHost anfügen, die den Treiber hostet. Wenn Sie den Debugger anfügen, können Sie Breakpoints in Ihrem Treiber festlegen.

Da die Treiberinitialisierung kurz nach dem Laden von WUDFHost erfolgt, ist es nicht möglich, den Initialisierungscode rechtzeitig manuell anzufügen. Stattdessen können Sie einen Registrierungswert festlegen, damit der Hostprozess einige Sekunden bei der Hostinitialisierung oder der Ladezeit des Treibers wartet. Diese Verzögerung gibt Ihnen Zeit, WinDbg an die richtige instance des WUDFHost-Prozesses anzufügen.

Folgen Sie diesen Schritten:

  1. Legen Sie in der Registrierung auf dem Zielcomputer HostProcessDbgBreakOnStart oder HostProcessDbgBreakOnDriverLoad auf eine Anzahl von Sekunden fest, und starten Sie dann neu.
  2. Öffnen Sie winDbg auf dem Zielcomputer als Administrator.
  3. Wählen Sie im Menü Datei die Option An Den Prozess anfügen aus. Wählen Sie Nach ausführbarer Datei aus, und suchen Sie nach allen Prozessen, die WUDFHost.exe benannt sind (es gibt möglicherweise keine). Wenn Prozesse mit dem Namen WUDFHost.exe vorhanden sind, notieren Sie sich deren Prozessbezeichner zur späteren Referenz.
  4. Aktivieren Sie in Geräte-Manager den Treiber.
  5. Wiederholen Sie Schritt 2, und suchen Sie eine neue instance WUDFHost.exe. Wenn keine neue instance von WUDFHost.exe angezeigt wird, klicken Sie auf Abbrechen, und wählen Sie erneut An Den Prozess anfügen aus. Wenn Sie die neue instance von WUDFHost.exe finden, wählen Sie sie aus, und klicken Sie auf OK.

Wenn Gerätepooling verwendet wird und Sie den Registrierungswert HostProcessDbgBreakOnDriverLoad festlegen, können Debuggerunterbrechungen aufgrund des Ladens anderer Treiber auftreten. Sie können gerätepooling deaktivieren, indem Sie den UMDF-Debugmodus verwenden.

Um den Debugmodus zu verwenden, verwenden Sie entweder die Option F5 in Visual Studio, oder legen Sie die Werte DebugModeFlags und DebugModeBinaries in der Registrierung fest.

Ausführliche Informationen zu UMDF-Registrierungswerten finden Sie unter Registrierungswerte zum Debuggen von WDF-Treibern (KMDF und UMDF).

Verwenden von WinDbg zum Remotedebuggen von einem Hostcomputer (Debuggen im Kernelmodus)

Richten Sie auf einem Remotehost eine Debugsitzung im Kernelmodus ein, und legen Sie dann den aktuellen Prozess auf den instance von Wudfhost fest, der Ihren Treiber hostet. Beim Debuggen über einen Remotekerneldebugger können Sie HostProcessDbgBreakOnDriverStart oder HostProcessDbgBreakOnDriverLoad auf 0x80000000 festlegen, um kein Timeout anzugeben, sondern in den Kerneldebugger einzubrechen.

Gehen Sie dazu folgendermaßen vor:

  1. Deaktivieren Sie das Pooling. Aktivieren Sie DebugModeFlags , und listen Sie Ihren Treiber in DebugModeBinaries auf.

  2. Wenn Ihr Treiber UMDF 1.11 oder höher verwendet, ist HostFailKdDebugBreak standardmäßig aktiviert. Überspringen Sie diesen Schritt.

    Wenn Ihr Treiber UMDF 1.9 oder früher verwendet, legen Sie HostFailKdDebugBreak auf 1 fest.

  3. Wenn Sie Probleme im Zusammenhang mit Timeouts debuggen, deaktivieren Sie HostProcessDbgBreakOnDriverStart und HostProcessDbgBreakOnDriverLoad. (Wenn HostProcessDbgBreakOnDriverStart oder HostProcessDbgBreakOnDriverLoad ungleich Null ist, deaktiviert das Framework Timeouts, sodass der Reflektor den Host nicht beendet, während ein Benutzermodusdebugger an den Hostprozess angefügt ist.) Wenn Sie den Treiberinitialisierungscode debuggen müssen, versuchen Sie, statt diese beiden Werte zu verwenden, den folgenden Befehl in WinDbg auszugeben, bevor Der Treiber geladen wird: sxe ld:MyDriver.dll (Unterbrechung beim Laden des Moduls)

  4. Starten Sie einen Neustart, wenn Sie Registrierungsänderungen vorgenommen haben.

  5. Abhängig von den oben getroffenen Auswahlen sollte Der Remotekerndebugger beim Laden oder Entladen des Treibers auf dem Ziel einbrechen.