Freigeben über


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

Weitere Informationen