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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für