Fehlersuche in einer UWP-App mit WinDbg
Sie können Universal Windows Platform (UWP)-Apps mit WinDbg debuggen. Dieser Ansatz wird typischerweise für erweiterte Szenarien verwendet, in denen es nicht möglich ist, die Debugging-Aufgabe mit dem integrierten Debugger von Visual Studio zu erledigen. Weitere Informationen zum Debuggen in Visual Studio finden Sie unter Debuggen in Visual Studio.
Anhängen an eine UWP-App
Das Anhängen an einen UWP-Prozess ist dasselbe wie das Anhängen an einen Prozess im Benutzermodus. In WinDbg können Sie sich zum Beispiel an einen ausgeführten Prozess anhängen, indem Sie Attach to a Process aus dem Menü File wählen oder F6 drücken. Weitere Informationen finden Sie unter Debuggen eines Benutzermodus-Prozesses mit WinDbg.
Eine UWP-App wird nicht auf dieselbe Weise angehalten, wie sie es tut, wenn sie nicht debuggt wird. Um eine UWP-App explizit anzuhalten/fortzusetzen, können Sie die Befehle .suspendpackage und .resumepackage verwenden (Details unten). Allgemeine Informationen zum Process Lifecycle Management (PLM), das von UWP-Apps verwendet wird, finden Sie unter Lebenszyklus von Apps und Starten, Fortsetzen und Hintergrundaufgaben.
Starten und Fehlersuche in einer UWP-App
Die Kommandozeilenparameter -plmPackage und -plmApp weisen den Debugger an, eine App im Debugger zu starten.
windbg.exe -plmPackage <PLMPackageName> -plmApp <ApplicationId> [<parameters>]
Da mehrere Apps in einem einzigen Package enthalten sein können, sind die beiden Parameter <PLMPackage> und <ApplicationId> erforderlich. Dies ist eine Zusammenfassung der Parameter.
Parameter | Beschreibung |
<PLMPackageName> | Der Name des Anwendungspakets. Verwenden Sie den Befehl .querypackages, um alle UWP-Anwendungen aufzulisten. Geben Sie keinen Pfad zum Speicherort des Pakets an, sondern nur den Namen des Pakets. |
<ApplicationId> | Die ApplicationId befindet sich in der Manifestdatei der Anwendung und kann mit den Befehlen .querypackage oder .querypackages angezeigt werden, wie in diesem Thema beschrieben. Weitere Informationen über die Manifestdatei der Anwendung finden Sie unter App-Paketmanifest. |
[<Parameter>] | Optionale Parameter, die an die App übergeben werden. Nicht alle Apps verwenden oder erfordern Parameter. |
HelloWorld-Beispiel
Zur Demonstration des UWP-Debugging wird in diesem Thema das HelloWorld-Beispiel verwendet, das in Erstellen einer „Hello, world“-App (XAML) beschrieben ist.
Um eine funktionsfähige Test-App zu erstellen, müssen Sie nur bis zum dritten Schritt der Übung gehen.
Suchen des vollständigen Paketnamens und der AppId
Verwenden Sie den Befehl .querypackages, um den vollständigen Paketnamen und die AppId zu finden. Geben Sie .querypackages ein und verwenden Sie dann die Tastenkombination STRG+F, um in der Ausgabe nach dem Anwendungsnamen zu suchen, z. B. HelloWorld. Wenn Sie den Eintrag mit STRG+F gefunden haben, wird der vollständige Paketname angezeigt, zum Beispiel e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8 und die AppId 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 Basis-Paketnamens im Manifest
Zur Fehlerbehebung sollten Sie sich den Namen des Basispakets in Visual Studio ansehen.
Um den Namen des Basispakets in Visual Studio zu finden, klicken Sie im Projekt-Explorer auf die Datei ApplicationManifest.xml. Der Name des Basispakets wird auf der Registerkarte Packaging als „Paketname“ angezeigt. Standardmäßig ist der Paketname eine GUID, zum Beispiel e24caf14-8483-4743-b80c-ca46c28c75df.
Um den Namen des Basispakets mit Notepad zu finden, öffnen Sie die Datei ApplicationManifest.xml und suchen Sie den Tag Identity Name.
<Identity
Name="e24caf14-8483-4743-b80c-ca46c28c75df"
Publisher="CN= User1"
Version="1.0.0.0" />
Auffinden der Anwendungs-ID im Manifest
Um die Anwendungs-ID in der Manifestdatei für eine installierte UWP-App zu finden, suchen Sie den Eintrag Application Id.
Für die "Hello world"-App lautet die Anwendungs-ID zum Beispiel App.
<Application Id="App"
Executable="$targetnametoken$.exe"
EntryPoint="HelloWorld.App">
Beispiel-WinDbg-Kommandozeile
Dies ist eine beispielhafte Kommandozeile, 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 über die Kommandozeile unter Verwendung der TaskId explizit unter dem Debugger gestartet werden. Verwenden Sie dazu die Kommandozeilenparameter -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 aufzulisten. Geben Sie keinen Pfad zum Speicherort des Pakets an, sondern nur den Namen des Pakets. |
<BackgroundTaskId> | Die BackgroundTaskId kann mit dem Befehl .querypackages wie unten beschrieben gefunden werden. Weitere Informationen über die Manifestdatei der Anwendung finden Sie unter App-Paketmanifest. |
Dies ist ein Beispiel für das Laden des SDKSamples.BackgroundTask Codes im 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 BackgroundTask-Beispielcode experimentieren, um sich mit dem UWP-Debugging vertraut zu machen. Sie können es unter Background task sample herunterladen.
Verwenden Sie den Befehl .querypackages, um die BackgroundTaskId zu finden. Verwenden Sie STRG+F, um die App zu suchen, und suchen Sie dann das Feld Background Task Id. Die Hintergrundaufgabe muss ausgeführt werden, damit der zugehörige Name der Hintergrundaufgabe und die Aufgaben-ID angezeigt werden.
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 Namen des Packages kennen, können Sie .querypackage verwenden, um das Feld Background Task Id anzuzeigen.
Sie können die BackgroundTaskId auch mit der Option enumerateBgTasks des PLMDebug ausfindig machen. Weitere Informationen über das Dienstprogramm PMLDebug 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
Remote-Debuggen eines UWP-Prozesses über einen Prozess-Server (DbgSrv)
Alle -plm*-Befehle funktionieren korrekt mit dbgsrv. Um mit dbgsrv zu debuggen, verwenden Sie den Schalter -premote mit der 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 Prozessserver (Benutzermodus) und Prozessserver-Beispiele.
Zusammenfassung der UWP-App-Befehle
Dieser Abschnitt enthält eine Zusammenfassung der UWP-App-Debugger-Befehle
Paketinformationen sammeln
.querypackage
.querypackage zeigt den Status einer UWP-Anwendung an. Wenn die App beispielsweise ausgeführt wird, kann sie sich im Status Active befinden.
.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 aktiviert die Fehlersuche und startet eine UWP-Anwendung.
.createpackageapp <PLMPackageName> <ApplicationId> [<parameters>]
In dieser Tabelle finden Sie die Parameter für .createpackageapp.
Parameter | Beschreibung |
<PLMPackageName> | Der Name des Anwendungspakets. Verwenden Sie den Befehl .querypackages, um alle UWP-Anwendungen aufzulisten. Geben Sie keinen Pfad zum Speicherort des Pakets an, sondern nur den Namen des Pakets. |
<ApplicationId> | Die ApplicationId kann mit .querypackage oder .querypackages gefunden werden, wie bereits in diesem Thema beschrieben. Weitere Informationen über die Manifestdatei der Anwendung finden Sie unter App-Paketmanifest. |
[<Parameter>] | Optionale Parameter, die an die Anwendung übergeben werden. Nicht alle Anwendungen benötigen 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 Debug-Befehlen
.enablepackagedebug
Der Befehl .enablepackagedebug aktiviert das Debugging für UWP-Anwendungen. Sie müssen .enablepackagedebug verwenden, bevor Sie eine der Funktionen suspend, resume oder terminate aufrufen.
Beachten Sie, dass der Befehl .createpackageapp auch das Debugging der App aktiviert.
.enablepackagedebug <PLMPackageName>
Beispiel:
.enablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
.disablepackagedebug
Der Befehl .disablepackagedebug deaktiviert das Debugging für UWP-Anwendungen.
.disablepackagedebug <PLMPackageName>
Beispiel:
.disablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Starten und Beenden von Apps
Beachten Sie, dass sich Suspend, Resume und Terminate auf alle derzeit ausgeführten Apps im Paket auswirken.
.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
Der Befehl .resumepackage nimmt eine UWP-Anwendung wieder auf.
.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 Debugging 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}
Anwendungsbeispiele
Anhängen eines Debuggers, wenn Ihre App gestartet wird
Angenommen, Sie haben 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 sich die vollständigen Namen und den Status aller installierten Pakete anzeigen lassen. Geben Sie in einem Fenster der Eingabeaufforderung den folgenden Befehl ein. Mit STRG+F können Sie in der Befehlsausgabe nach dem Namen der App HelloWorld suchen.
.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 anzuhängen. Der Befehl .createpackageapp ermöglicht auch die Fehlersuche in der App.
.createpackageapp e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8 App
Wenn Sie das Debugging abgeschlossen haben, verringern Sie die Anzahl der Debug-Referenzen für das Package mit dem Befehl .disablepackagedebug.
.disablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Anhängen eines Debuggers an eine App, die bereits ausgeführt wird
Angenommen, Sie möchten WinDbg an MyApp anhängen, das bereits ausgeführt wird. Wählen Sie in WinDbg im Menü File den Befehl Attach to a Process. Notieren Sie sich die Prozess-ID von MyApp. Sagen wir, die Prozess-ID lautet 4816. Erhöhen Sie die Anzahl der Debug-Referenzen für das Package, das MyApp enthält.
.enablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Wählen Sie in WinDbg im Dialogfeld Attach to Process den Prozess 4816, und klicken Sie auf OK. WinDbg wird sich an MyApp anhängen.
Wenn Sie das Debugging abgeschlossen haben, verringern Sie die Anzahl der Debug-Referenzen für das Package mit dem Befehl .disablepackagedebug.
.disablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Manuelles Anhalten und Wiederaufnehmen Ihrer App
Folgen Sie diesen Schritten, um Ihre App manuell anzuhalten und fortzusetzen. Erhöhen Sie zunächst die Anzahl der Debug-Referenzen für das Package, das Ihre App enthält.
.enablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Halten Sie das Package an. Der Suspend-Handler Ihrer App wird aufgerufen, was für das Debugging hilfreich sein kann.
.suspendpackage e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Wenn Sie die Fehlersuche abgeschlossen haben, setzen Sie das Package wieder fort.
.resumepackage e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Verringern Sie schließlich die Anzahl der Debug-Referenzen für das Package.
.disablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8