Debuggen einer UWP-App mit WinDbg

Sie können Universelle Windows-Plattform-App (UWP) mithilfe von WinDbg debuggen. Dieser Ansatz wird in der Regel für erweiterte Szenarien verwendet, in denen es nicht möglich ist, die Debugaufgabe mithilfe des integrierten Visual Studio-Debuggers abzuschließen. Weitere Informationen zum Debuggen in Visual Studio finden Sie unter Debuggen in Visual Studio.

Anfügen an eine UWP-App

Das Anfügen an einen UWP-Prozess ist identisch mit dem Anfügen an einen Benutzermodusprozess. Beispielsweise können Sie in WinDbg einen ausgeführten Prozess anfügen, indem Sie im Menü Datei die Option An einen Prozess anfügen auswählen oder F6 drücken. Weitere Informationen finden Sie unter Debuggen eines User-Mode-Prozesses mithilfe von WinDbg.

Eine UWP-App wird nicht auf die gleiche Weise angehalten wie, wenn sie nicht debuggt wird. Zum expliziten Anhalten/Fortsetzen einer UWP-App können Sie die Befehle .suspendpackage und .resumepackage verwenden (Details unten). Allgemeine Informationen zu Process Lifecycle Management (PLM), die von UWP-Apps verwendet werden, finden Sie unter App-Lebenszyklus und Starten, Fortsetzen und Hintergrundaufgaben.

Starten und Debuggen einer UWP-App

Die Befehlszeilenparameter -plmPackage und -plmApp weisen den Debugger an, eine App unter dem Debugger zu starten.

windbg.exe -plmPackage <PLMPackageName> -plmApp <ApplicationId> [<parameters>]

Da mehrere Apps in einem einzelnen Paket enthalten sein können, sind sowohl PLMPackage>- als <auch <ApplicationId-Parameter> erforderlich. Dies ist eine Zusammenfassung der Parameter.

Parameter Beschreibung
<PLMPackageName> Der Name des Anwendungspakets. Verwenden Sie den Befehl .querypackages, um alle UWP-Anwendungen auflisten zu können. Geben Sie keinen Pfad zum Speicherort des Pakets an, und geben Sie nur den Paketnamen an.
<ApplicationId>

Die ApplicationId befindet sich in der Anwendungsmanifestdatei und kann mit dem Befehl .querypackage oder .querypackages angezeigt werden, wie in diesem Thema erläutert.

Weitere Informationen zur Anwendungsmanifestdatei finden Sie unter App-Paketmanifest.

[<Parameter>]

Optionale Parameter, die an die App übergeben werden. Nicht alle Apps verwenden oder erfordern Parameter.

HelloWorld-Beispiel

Um das UWP-Debuggen zu veranschaulichen, verwendet dieses Thema das HelloWorld-Beispiel, das unter Erstellen einer "Hello, world"-App (XAML) beschrieben wird.

Um eine funktionsfähige Test-App zu erstellen, müssen Sie nur bis zu Schritt 3 des Labs ausführen.

Suchen des vollständigen Paketnamens und der AppId

Verwenden Sie den Befehl .querypackages, um den vollständigen Paketnamen und die AppId zu suchen. Geben Sie .querypackages ein, und verwenden Sie dann CRTL+F, um in der Ausgabe nach dem Anwendungsnamen zu suchen, z. B. HelloWorld. Wenn sich der Eintrag mit STRG+F befindet, wird der vollständige Paketname angezeigt, z. B. e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8 und die AppId von App.

Beispiel:

0:000>  .querypackages 
...
Package Full Name: e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Package Display Name: HelloWorld
Version: 1.0.0.0
Processor Architecture: x86
Publisher: CN=user1
Publisher Display Name: user1
Install Folder: c:\users\user1\documents\visual studio 2015\Projects\HelloWorld\HelloWorld\bin\x86\Release\AppX
Package State: Unknown
AppId: App
...

Anzeigen des Basispaketnamens im Manifest

Zur Problembehandlung können Sie den Namen des Basispakets in Visual Studio anzeigen.

Um den Namen des Basispakets in Visual Studio zu suchen, klicken Sie im Projekt-Explorer auf die ApplicationManifest.xml Datei. Der Name des Basispakets wird auf der Registerkarte "Paket" als "Paketname" angezeigt. Standardmäßig ist der Paketname eine GUID, z. B. e24caf14-8483-4743-b80c-ca46c28c75df.

Wenn Sie Editor verwenden möchten, um den Namen des Basispakets zu suchen, öffnen Sie die ApplicationManifest.xml Datei, und suchen Sie das Tag Identitätsname .

  <Identity
    Name="e24caf14-8483-4743-b80c-ca46c28c75df"
    Publisher="CN= User1"
    Version="1.0.0.0" />

Suchen der Anwendungs-ID im Manifest

Um die Anwendungs-ID in der Manifestdatei für eine installierte UWP-App zu suchen, suchen Sie nach dem Eintrag Anwendungs-ID .

Für die App "hello world" lautet die Anwendungs-ID beispielsweise App.

<Application Id="App"
      Executable="$targetnametoken$.exe"
      EntryPoint="HelloWorld.App">

WinDbg-Beispiel-Befehlszeile

Dies ist eine Beispiel-Befehlszeile, die die HelloWorld-App unter dem Debugger mit dem vollständigen Paketnamen und der AppId lädt.

windbg.exe -plmPackage e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8 -plmApp App

Starten einer Hintergrundaufgabe unter dem Debugger

Eine Hintergrundaufgabe kann mithilfe der TaskId explizit über die Befehlszeile unter dem Debugger gestartet werden. Verwenden Sie hierzu die Befehlszeilenparameter -plmPackage und -plmBgTaskId:

windbg.exe -plmPackage <PLMPackageName> -plmBgTaskId <BackgroundTaskId>
Parameter Beschreibung
<PLMPackageName>

Der Name des Anwendungspakets. Verwenden Sie den Befehl .querypackages, um alle UWP-Anwendungen auflisten zu können. Geben Sie keinen Pfad zum Speicherort des Pakets an, und geben Sie nur den Paketnamen an.

<BackgroundTaskId>

Die BackgroundTaskId kann mithilfe des Befehls .querypackages gefunden werden, wie unten beschrieben.

Weitere Informationen zur Anwendungsmanifestdatei finden Sie unter App-Paketmanifest.

Dies ist ein Beispiel für das Laden des SDKSamples.BackgroundTask-Codes unter dem Debugger.

windbg.exe -plmPackage Microsoft.SDKSamples.BackgroundTask.CPP_1.0.0.0_x64__8wekyb3d8bbwe -plmBgTaskId {ee4438ee-22db-4cdd-85e4-8ad8a1063523}

Sie können mit dem Beispielcode der Hintergrundaufgabe experimentieren, um sich mit dem UWP-Debuggen vertraut zu machen. Es kann unter Hintergrundaufgabebeispiel heruntergeladen werden.

Verwenden Sie den Befehl .querypackages, um die BackgroundTaskId zu suchen. Verwenden Sie STRG-F, um die App zu suchen und dann das Feld Hintergrundaufgabe-ID zu suchen. Die Hintergrundaufgabe muss ausgeführt werden, um den Namen und die Aufgaben-ID der zugeordneten Hintergrundaufgabe anzuzeigen.

0:000> .querypackages
...
Package Full Name: Microsoft.SDKSamples.BackgroundTask.CPP_1.0.0.0_x86__8wekyb3d8bbwe
Package Display Name: BackgroundTask C++ sample
Version: 1.0.0.0
Processor Architecture: x86
Publisher: CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
Publisher Display Name: Microsoft Corporation
Install Folder: C:\Users\user1\Documents\Visual Studio 2015\Projects\Background_task_sample\C++\Debug\BackgroundTask.Windows\AppX
Package State: Running
AppId: BackgroundTask.App
Background Task Name: SampleBackgroundTask
Background Task Id: {ee4438ee-22db-4cdd-85e4-8ad8a1063523}
...

Wenn Sie den vollständigen Paketnamen kennen, können Sie .querypackage verwenden, um das Feld Hintergrundaufgaben-ID anzuzeigen.

Sie können die BackgroundTaskId auch mithilfe der Option enumerateBgTasks des PLMDebug suchen. Weitere Informationen zur PMLDebug-Utiltity finden Sie unter PLMDebug.

C:\Program Files\Debugging Tools for Windows (x64)>PLMDebug /enumerateBgTasks Microsoft.SDKSamples.BackgroundTask.CPP_1.0.0.0_x64__8wekyb3d8bbwe
Package full name is Microsoft.SDKSamples.BackgroundTask.CPP_1.0.0.0_x64__8wekyb3d8bbwe.
Background Tasks:
SampleBackgroundTask : {C05806B1-9647-4765-9A0F-97182CEA5AAD}

SUCCEEDED

Remotedebuggen eines UWP-Prozesses mithilfe eines Prozessservers (DbgSrv)

Alle -plm*-Befehle funktionieren ordnungsgemäß mit dbgsrv. Verwenden Sie zum Debuggen mit dbgsrv den Switch -premote mit dem Verbindungszeichenfolge für dbgsrv:

windbg.exe -premote npipe:pipe=fdsa,server=localhost -plmPackage e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8 -plmApp App

Weitere Informationen zu den Premote-Optionen finden Sie unter Beispiele für Prozessserver (Benutzermodus) und Prozessserver.

Zusammenfassung der UWP-App-Befehle

Dieser Abschnitt enthält eine Zusammenfassung der UWP-App-Debuggerbefehle.

Sammeln von Paketinformationen

.querypackage

Das Abfragepaket zeigt den Status einer UWP-Anwendung an. Wenn die App beispielsweise ausgeführt wird, kann sie den Status Aktiv aufweisen.

.querypackage <PLMPackageName>

Beispiel:

0:000> .querypackage e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Package Full Name: e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Package Display Name: HelloWorld
Version: 1.0.0.0
Processor Architecture: x86
Publisher: CN=user1
Publisher Display Name: user1
Install Folder: c:\users\user1\documents\visual studio 2015\Projects\HelloWorld\HelloWorld\bin\x86\Release\AppX
Package State: Running
AppId: App
Executable: HelloWorld.exe

.querypackages

Der Befehl .querypackages listet alle installierten UWP-Anwendungen und ihren aktuellen Status auf.

.querypackages

Beispiel:

0:000> .querypackages
...
Package Full Name: Microsoft.MicrosoftSolitaireCollection_3.9.5250.0_x64__8wekyb3d8bbwe
Package Display Name: Microsoft Solitaire Collection
Version: 3.9.5250.0
Processor Architecture: x64
Publisher: CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
Publisher Display Name: Microsoft Studios
Install Folder: C:\Program Files\WindowsApps\Microsoft.MicrosoftSolitaireCollection_3.9.5250.0_x64__8wekyb3d8bbwe
Package State: Unknown
AppId: App

Package Full Name: e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Package Display Name: HelloWorld
Version: 1.0.0.0
Processor Architecture: x86
Publisher: CN=user1
Publisher Display Name: user1
Install Folder: c:\users\user1\documents\visual studio 2015\Projects\HelloWorld\HelloWorld\bin\x86\Release\AppX
Package State: Running
AppId: App
Executable: HelloWorld.exe

Package Full Name: Microsoft.SDKSamples.BackgroundTask.CPP_1.0.0.0_x86__8wekyb3d8bbwe
Package Display Name: BackgroundTask C++ sample
Version: 1.0.0.0
Processor Architecture: x86
Publisher: CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
Publisher Display Name: Microsoft Corporation
Install Folder: C:\Users\user1\Documents\Visual Studio 2015\Projects\Background_task_sample\C++\Debug\BackgroundTask.Windows\AppX
Package State: Unknown
AppId: BackgroundTask.App

...

Starten einer App zum Debuggen

.createpackageapp

Der Befehl .createpackageapp ermöglicht das Debuggen und startet eine UWP-Anwendung.

.createpackageapp <PLMPackageName> <ApplicationId> [<parameters>] 

In dieser Tabelle sind die Parameter für .createpackageapp aufgeführt.

Parameter Beschreibung
<PLMPackageName> Der Name des Anwendungspakets. Verwenden Sie den Befehl .querypackages, um alle UWP-Anwendungen auflisten zu können. Geben Sie keinen Pfad zum Speicherort des Pakets an, und geben Sie nur den Paketnamen an.
<ApplicationId>

Die ApplicationId kann mithilfe von .querypackage oder .querypackages gefunden werden, wie weiter oben in diesem Thema erläutert.

Weitere Informationen zur Anwendungsmanifestdatei finden Sie unter App-Paketmanifest.

[<Parameter>] Optionale Parameter, die an die Anwendung übergeben werden. Nicht alle Anwendungen erfordern oder verwenden diese optionalen Parameter.

Beispiel:

.createpackageapp e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8 App

Aktivieren und Deaktivieren der Verwendung von Debugbefehlen

.enablepackagedebug

Der Befehl .enablepackagedebug ermöglicht das Debuggen für die UWP-Anwendung. Sie müssen .enablepackagedebug verwenden, bevor Sie eine der Funktionen anhalten, fortsetzen oder beenden aufrufen.

Beachten Sie, dass der Befehl .createpackageapp auch das Debuggen der App ermöglicht.

.enablepackagedebug <PLMPackageName>

Beispiel:

.enablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

.disablepackagedebug

Mit dem Befehl .disablepackagedebug wird das Debuggen für die UWP-Anwendung deaktiviert.

.disablepackagedebug <PLMPackageName>

Beispiel:

.disablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

Starten und Beenden von Apps

Beachten Sie, dass sich das Anhalten, Fortsetzen und Beenden auf alle derzeit ausgeführten Apps im Paket auswirkt.

.suspendpackage

Mit dem Befehl .suspendpackage wird eine UWP-Anwendung angehalten.

.suspendpackage <PLMPackageName> 

Beispiel:

0:024> .suspendpackage e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

.resumepackage

Mit dem Befehl .resumepackage wird eine UWP-Anwendung fortgesetzt.

.resumepackage <PLMPackageName> 

Beispiel:

.resumepackage e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

.terminatepackageapp

Der Befehl .terminatepackageapp beendet alle UWP-Anwendungen im Paket.

.terminatepackageapp <PLMPackageName> 

Beispiel:

.terminatepackageapp e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

Hintergrundaufgaben

.activatepackagebgtask

Der Befehl .activatepackagebgtask aktiviert das Debuggen und startet eine UWP-Hintergrundaufgabe.

 .activatepackagebgtask <PLMPackageName> <bgTaskId>

Beispiel:

.activatepackagebgtask Microsoft.SDKSamples.BackgroundTask.CPP_1.0.0.0_x64__8wekyb3d8bbwe {C05806B1-9647-4765-9A0F-97182CEA5AAD}

Nutzungsbeispiele

Anfügen eines Debuggers beim Starten Ihrer App

Angenommen, Sie verfügen über eine App namens HelloWorld, die sich in einem Paket namens e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8 befindet. Überprüfen Sie, ob Ihr Paket installiert ist, indem Sie die vollständigen Namen und die Ausführungszustände aller installierten Pakete anzeigen. Geben Sie in einem Eingabeaufforderungsfenster den folgenden Befehl ein. Sie können STRG+F verwenden, um die Befehlsausgabe nach dem App-Namen von HelloWorld zu durchsuchen.

.querypackages 
...

Package Full Name: e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Package Display Name: HelloWorld
Version: 1.0.0.0
Processor Architecture: x86
Publisher: CN=user1
Publisher Display Name: user1
Install Folder: c:\users\user1\documents\visual studio 2015\Projects\HelloWorld\HelloWorld\bin\x86\Release\AppX
Package State: Unknown
AppId: App

...

Verwenden Sie .createpackageapp, um die App zu starten und an sie anzufügen. Der Befehl .createpackageapp ermöglicht auch das Debuggen der App.

.createpackageapp e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8 App

Wenn Sie das Debuggen abgeschlossen haben, verringern Sie die Debugverweisanzahl für das Paket mithilfe des Befehls .disablepackagedebug.

.disablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

Anfügen eines Debuggers an eine App, die bereits ausgeführt wird

Angenommen, Sie möchten WinDbg an MyApp anfügen, das bereits ausgeführt wird. Wählen Sie in WinDbg im Menü Datei die Option An einen Prozess anfügen aus. Notieren Sie sich die Prozess-ID für MyApp. Angenommen, die Prozess-ID lautet 4816. Erhöhen Sie die Anzahl der Debugreferenzen für das Paket, das MyApp enthält.

.enablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

Wählen Sie in WinDbg im Dialogfeld An Prozess anfügen die Option Prozess 4816 aus, und klicken Sie auf OK. WinDbg wird an MyApp angefügt.

Wenn Sie das Debuggen abgeschlossen haben, verringern Sie die Debugverweisanzahl für das Paket mithilfe des Befehls .disablepackagedebug.

.disablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

Manuelles Anhalten und Fortsetzen Ihrer App

Führen Sie die folgenden Schritte aus, um Ihre App manuell anzusetzen und fortzusetzen. Erhöhen Sie zunächst die Debugverweisanzahl für das Paket, das Ihre App enthält.

.enablepackagedebug  e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

Setzen Sie das Paket an. Der Sperrhandler Ihrer App wird aufgerufen, was beim Debuggen hilfreich sein kann.

.suspendpackage e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

Wenn Sie das Debuggen abgeschlossen haben, setzen Sie das Paket fort.

.resumepackage e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

Dekrementieren Sie schließlich die Debugverweisanzahl für das Paket.

.disablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

Siehe auch