Débogage d’une application UWP à l’aide de WinDbg

Vous pouvez déboguer une application de plateforme Windows universelle (UWP) à l’aide de WinDbg. Cette approche est généralement utilisée pour les scénarios avancés, pour lesquels il est impossible d’effectuer la tâche de débogage à l’aide du débogueur Visual Studio intégré. Pour plus d’informations sur le débogage dans Visual Studio, consultez la page Débogage dans Visual Studio.

Attachement à une application UWP

L’attachement au processus UWP est identique à l’attachement à un processus en mode utilisateur. Par exemple, dans WinDbg, vous pouvez établir un attachement à un processus en cours d’exécution en choisissant Attachement à un processus à partir du menu Fichier ou en appuyant sur F6. Pour en savoir plus, consultez Débogage d’un processus en mode utilisateur à l’aide de WinDbg.

Une application UWP ne sera pas suspendue de la même manière que lorsqu’elle n’est pas en cours de débogage. Pour suspendre/relancer explicitement une application UWP, vous pouvez utiliser les commandes .suspendpackage et .resumepackage (détails ci-dessous). Pour obtenir des informations générales sur le processus de gestion du cycle de vie (PLM) utilisé par les applications UWP, consultez Cycle de vie de l’application et Lancement, reprise et tâches en arrière-plan.

Lancement et débogage d’une application UWP

Les paramètres de ligne de commande -plmPackage et -plmApp indiquent au débogueur de lancer une application sous le débogueur.

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

Étant donné qu’un seul package peut contenir plusieurs applications, les paramètres <PLMPackage> et <ApplicationId> sont obligatoires. Voici un récapitulatif des paramètres.

Paramètre Description
<PLMPackageName> Le nom du package d’application. Utilisez la commande .querypackages pour répertorier toutes les applications UWP. Ne fournissez pas de chemin d’accès à l’emplacement du package, indiquez simplement le nom du package.
<ApplicationId>

ApplicationId se trouve dans le fichier manifeste de l’application et peut être consulté à l’aide de la commande .querypackage ou .querypackages, comme indiqué dans cette rubrique.

Pour en savoir plus sur le fichier manifeste de l’application, consultez Manifeste du package de l’application.

[<paramètres>]

Paramètres facultatifs transmis à l’application. Toutes les applications n’utilisent pas ou ne requièrent pas de paramètres.

Exemple Hello World

Pour illustrer le débogage UWP, cette rubrique utilise l’exemple HelloWorld décrit dans Créer une application « Hello, world » (XAML).

Pour créer une application test exploitable, il suffit d’aller jusqu’à la troisième étape du labo.

Localisation du nom complet du package et de l’AppId

Utilisez la commande .querypackages pour rechercher le nom complet du package et l’AppId. Saisissez .querypackages, puis utilisateur CRTL+F pour rechercher dans la sortie le nom de l’application, tel que HelloWorld. Lorsque l’entrée est trouvée à l’aide de Ctrl+F, le nom complet du package, par exemple e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe4447vaan8 et l’AppId de l’application apparaissent.

Exemple :

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
...

Affichage du nom du package de base dans le manifeste

Pour résoudre des problèmes, vous pouvez vouloir afficher le nom du paquet de base dans Visual Studio.

Pour localiser le nom du package de base dans Visual Studio, cliquez sur le fichier ApplicationManifest.xml dans l’Explorateur de projets. Le nom du package de base s’affiche sous l’onglet Packages en tant que « Nom du package ». Par défaut, le nom du package est un GUID, par exemple e24caf14-8483-4743-b80c-ca46c28c75df.

Pour utiliser le Bloc-notes pour localiser le nom du package de base, ouvrez le fichier ApplicationManifest.xml et recherchez la balise Identity Name.

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

Localisation de l’ID de l’application dans le manifeste

Pour localiser l’ID de l’application dans le fichier manifeste d’une application UWP installée, recherchez l’entrée ID de l’application.

Par exemple, pour l’application hello world, l’ID de l’application est Application.

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

Exemple de ligne de commande WinDbg

Voici un exemple de ligne de commande chargeant l’application HelloWorld sous le débogueur en utilisant le nom complet du paquet et l’AppId.

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

Lancement d’une tâche en arrière-plan sous le débogueur

Une tâche en arrière-plan peut être lancée explicitement sous le débogueur à partir de la ligne de commande à l’aide de TaskId. Pour ce faire, utilisez les paramètres de ligne de commande -plmPackage et -plmBgTaskId :

windbg.exe -plmPackage <PLMPackageName> -plmBgTaskId <BackgroundTaskId>
Paramètre Description
<PLMPackageName>

Le nom du package d’application. Utilisez la commande .querypackages pour répertorier toutes les applications UWP. Ne fournissez pas de chemin d’accès à l’emplacement du package, indiquez simplement le nom du package.

<BackgroundTaskId>

BackgroundTaskId peut être localisée à l’aide de la commande .querypackages, comme décrit ci-dessous.

Pour en savoir plus sur le fichier manifeste de l’application, consultez Manifeste du package de l’application.

Voici un exemple de chargement du code SDKSamples.BackgroundTask sous le débogueur.

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

Vous pouvez expérimenter avec l’exemple de code de la tâche d’arrière-plan pour vous familiariser avec le débogage UWP. Il peut être téléchargé dans l’Exemple de tâche en arrière-plan.

Utilisez la commande .querypackages pour localiser BackgroundTaskId. Utilisez CTRL-F pour localiser l’application, puis recherchez le champ Id de la tâche en arrière-plan. La tâche en arrière-plan doit être en cours d’exécution pour afficher le nom de la tâche en arrière-plan associée et l’ID de tâche.

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}
...

Si vous connaissez le nom complet du package, vous pouvez utiliser .querypackage pour afficher le champ Id de la tâche en arrière-plan.

Vous pouvez également localiser BackgroundTaskId à l’aide de l’option enumerateBgTasks de PLMDebug. Pour en savoir plus sur l’utilitaire PMLDebug, consultez 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

Débogage d’un processus UWP à distance à l’aide d’un serveur de processus (DbgSrv)

Toutes les commandes -plm* fonctionnent correctement avec dbgsrv. Pour déboguer à l’aide de dbgsrv, utilisez le commutateur -premote avec la chaîne de connexion pour dbgsrv :

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

Pour en savoir plus sur les options -premote, consultez Serveurs de processus (mode utilisateur) et Exemples de serveur de processus.

Récapitulatif des commandes des applications UWP

Cette section fournit un récapitulatif des commandes du débogueur d’applications UWP

Collecte d’informations sur le package

.querypackage

Le .querypackage affiche l’état d’une application UWP. Par exemple, si l’application est en cours d’exécution, elle peut se trouver dans l’état Active.

.querypackage <PLMPackageName>

Exemple :

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

La commande .querypackages répertorie toutes les applications UWP installées et leur état actuel.

.querypackages

Exemple :

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

...

Lancement d’une application pour le débogage

.createpackageapp

La commande .createpackageapp active le débogage et lance une application UWP.

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

Ce tableau répertorie les paramètres de .createpackageapp.

Paramètre Description
<PLMPackageName> Le nom du package d’application. Utilisez la commande .querypackages pour répertorier toutes les applications UWP. Ne fournissez pas de chemin d’accès à l’emplacement du package, indiquez simplement le nom du package.
<ApplicationId>

L’ApplicationId peut être localisée à l’aide de .querypackage ou de .querypackages, comme indiqué précédemment dans cette rubrique.

Pour en savoir plus sur le fichier manifeste de l’application, consultez Manifeste du package de l’application.

[<paramètres>] Paramètres facultatifs transmis à l’application. Toutes les applications ne requièrent pas ou n’utilisent pas ces paramètres facultatifs.

Exemple :

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

Activation et désactivation de l’utilisation des commandes de débogage

.enablepackagedebug

La commande .enablepackagedebug active le débogage d’une application UWP. Vous devez utiliser .enablepackagedebug avant d’appeler l’une des fonctions de suspension, de reprise ou de fin.

Il convient de noter que la commande .createpackageapp active également le débogage de l’application.

.enablepackagedebug <PLMPackageName>

Exemple :

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

.disablepackagedebug

La commande .disablepackagedebug désactive le débogage d’une application UWP.

.disablepackagedebug <PLMPackageName>

Exemple :

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

Lancement et arrêt des application

Il convient de noter que la suspension, la reprise et l’arrêt affectent toutes les applications en cours d’exécution dans le package.

.suspendpackage

La commande .suspendpackage suspend une application UWP.

.suspendpackage <PLMPackageName> 

Exemple :

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

.resumepackage

La commande .resumepackage relance une application UWP.

.resumepackage <PLMPackageName> 

Exemple :

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

.terminatepackageapp

La commande .terminatepackageapp met fin à toutes les applications UWP dans le package.

.terminatepackageapp <PLMPackageName> 

Exemple :

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

Tâches en arrière-plan

.activatepackagebgtask

La commande .activatepackagebgtask active le débogage et lance une tâche UWP en arrière-plan.

 .activatepackagebgtask <PLMPackageName> <bgTaskId>

Exemple :

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

Exemples d’utilisation

Attacher un débogueur lorsque votre application est lancée

Supposons que vous ayez une application nommée HelloWorld qui se trouve dans un package appelé e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8. Vérifiez que votre package est installé en affichant les noms complets et les états d’exécution de tous les packages installés. Dans une fenêtre d’invite de commandes, entrez la commande suivante. Vous pouvez utiliser CTRL+F pour rechercher la sortie de la commande pour le nom de l’application HelloWorld.

.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

...

Utilisez .createpackageapp pour le lancement et l’attachement à l’application. La commande .createpackageapp active également le débogage de l’application.

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

Une fois le débogage terminé, décrémentez le nombre de références de débogage pour le package à l’aide de la commande .disablepackagedebug.

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

Attacher un débogueur à une application en cours d’exécution

Supposons que vous souhaitez attacher WinDbg à MyApp, qui est déjà en cours d’exécution. Dans WinDbg, dans le menu Fichier, choisissez Attacher à un processus. Notez l’ID de processus pour MyApp. Supposons que l’ID de processus soit 4816. Incrémentez le nombre de références de débogage pour le package qui contient MyApp.

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

Dans WinDbg, dans la boîte de dialogue Attacher au processus , sélectionnez le processus 4816, puis cliquez sur OK. WinDbg s’attache à MyApp.

Une fois le débogage terminé, décrémentez le nombre de références de débogage pour le package à l’aide de la commande .disablepackagedebug.

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

Suspendre et relancer manuellement votre application

Suivez ces étapes pour suspendre et relancer manuellement votre application. Commencez par incrémenter le nombre de références de débogage pour le package qui contient votre application.

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

Suspendez le package. Le gestionnaire de suspension de votre application est appelé, ce qui peut s’avérer utile pour le débogage.

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

Une fois le débogage terminé, relancez le package.

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

Enfin, décrémentez le nombre de références de débogage pour le package.

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

Voir aussi