Debug di un'app UWP con WinDbg

È possibile eseguire il debug dell'app piattaforma UWP (Universal Windows Platform) (UWP) usando WinDbg. Questo approccio viene in genere usato per scenari avanzati, in cui non è possibile completare l'attività di debug usando il debugger predefinito di Visual Studio. Per altre informazioni sul debug in Visual Studio, vedere Debug in Visual Studio.

Collegamento a un'app UWP

L'associazione al processo UWP corrisponde al collegamento a un processo in modalità utente. Ad esempio, in WinDbg è possibile collegarsi a un processo in esecuzione scegliendo Collega a un processo dal menu File o premendo F6. Per altre informazioni, vedere Debug di un processo di User-Mode tramite WinDbg.

Un'app UWP non verrà sospesa nello stesso modo in cui non viene eseguito il debug. Per sospendere/riprendere in modo esplicito un'app UWP, è possibile usare i comandi con estensione suspendpackage e resumepackage (dettagli di seguito). Per informazioni generali sulla gestione del ciclo di vita del processo (PLM) usata dalle app UWP, vedere Ciclo di vita dell'appe Avvio, ripresa e attività in background.

Avvio e debug di un'app UWP

I parametri della riga di comando -plmPackage e -plmApp indicano al debugger di avviare un'app nel debugger.

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

Poiché sono necessarie più app all'interno di un singolo pacchetto, <sono necessari parametri PLMPackage> e <ApplicationId> . Questo è un riepilogo dei parametri.

Parametro Descrizione
<PLMPackageName> Nome del pacchetto dell'applicazione. Usare il comando .querypackages per elencare tutte le applicazioni UWP. Non fornire un percorso al percorso del pacchetto, specificare solo il nome del pacchetto.
<ApplicationId>

ApplicationId si trova nel file manifesto dell'applicazione e può essere visualizzato usando il comando querypackage o querypackages come illustrato in questo argomento.

Per altre informazioni sul file manifesto dell'applicazione, vedere Manifesto del pacchetto app.

[<parametri>]

Parametri facoltativi passati all'app. Non tutte le app usano o richiedono parametri.

Esempio helloWorld

Per illustrare il debug UWP, questo argomento usa l'esempio HelloWorld descritto in Creare un'app "Hello, world" (XAML).

Per creare un'app di test funzionante, è necessario completare fino al passaggio tre del lab.

Individuazione del nome completo del pacchetto e appId

Usare il comando .querypackages per individuare il nome completo del pacchetto e l'AppId. Digitare i pacchetti query e quindi l'utente CRTL+F per cercare nell'output il nome dell'applicazione, ad esempio HelloWorld. Quando la voce si trova usando CTRL+F, visualizzerà il nome completo del pacchetto, ad esempio e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0.0_x86__97ghe447vaan8 e AppId dell'app.

Esempio:

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

Visualizzazione del nome del pacchetto di base nel manifesto

Per la risoluzione dei problemi, è possibile visualizzare il nome del pacchetto di base in Visual Studio.

Per individuare il nome del pacchetto di base in Visual Studio, fare clic sul file ApplicationManifest.xml in Esplora progetti. Il nome del pacchetto di base verrà visualizzato nella scheda creazione di pacchetti come "Nome pacchetto". Per impostazione predefinita, il nome del pacchetto sarà un GUID, ad esempio e24caf14-8483-4743-b80c-ca46c28c75df.

Per usare il blocco note per individuare il nome del pacchetto di base, aprire il file ApplicationManifest.xml e individuare il tag Nome identità .

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

Individuazione dell'ID applicazione nel manifesto

Per individuare l'ID applicazione nel file manifesto per un'app UWP installata, cercare la voce ID applicazione .

Ad esempio, per l'app hello world l'ID applicazione è App.

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

Riga di comando WinDbg di esempio

Si tratta di una riga di comando di esempio che carica l'app HelloWorld nel debugger usando il nome completo del pacchetto e AppId.

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

Avvio di un'attività in background nel debugger

Un'attività in background può essere avviata in modo esplicito sotto il debugger dalla riga di comando usando TaskId. A tale scopo, usare i parametri della riga di comando -plmPackage e -plmBgTaskId:

windbg.exe -plmPackage <PLMPackageName> -plmBgTaskId <BackgroundTaskId>
Parametro Descrizione
<PLMPackageName>

Nome del pacchetto dell'applicazione. Usare il comando .querypackages per elencare tutte le applicazioni UWP. Non fornire un percorso al percorso del pacchetto, specificare solo il nome del pacchetto.

<BackgroundTaskId>

BackgroundTaskId può trovarsi usando il comando .querypackages, come descritto di seguito.

Per altre informazioni sul file manifesto dell'applicazione, vedere Manifesto del pacchetto app.

Questo è un esempio di caricamento del codice SDKSamples.BackgroundTask nel debugger.

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

È possibile sperimentare il codice di esempio di attività In background per acquisire familiarità con il debug UWP. Può essere scaricato nell'esempio di attività In background.

Usare il comando querypackages per individuare BackgroundTaskId. Usare CTRL-F per individuare l'app e quindi individuare il campo ID attività in background . L'attività in background deve essere in esecuzione per visualizzare il nome dell'attività in background associato e l'ID attività.

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

Se si conosce il nome completo del pacchetto, è possibile usare .querypackage per visualizzare il campo ID attività in background .

È anche possibile individuare BackgroundTaskId usando l'opzione enumerateBgTasks di PLMDebug. Per altre informazioni sull'utiltity PMLDebug, vedere 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

Debug di un processo UWP in remoto usando un server di elaborazione (DbgSrv)

Tutti i comandi -plm* funzionano correttamente con dbgsrv. Per eseguire il debug usando dbgsrv, usare l'opzione -premote con il stringa di connessione per dbgsrv:

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

Per altre informazioni sulle opzioni -premote, vedere Esempi di server di elaborazione (modalità utente) e server di elaborazione.

Riepilogo dei comandi delle app UWP

Questa sezione fornisce un riepilogo dei comandi del debugger delle app UWP

Raccolta di informazioni sul pacchetto

Pacchetto di query

Il pacchetto di query visualizza lo stato di un'applicazione UWP. Ad esempio, se l'app è in esecuzione, può essere nello stato attivo .

.querypackage <PLMPackageName>

Esempio:

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

Pacchetti di query

Il comando .querypackages elenca tutte le applicazioni UWP installate e il relativo stato corrente.

.querypackages

Esempio:

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

...

Avvio di un'app per il debug

.createpackageapp

Il comando .createpackageapp abilita il debug e avvia un'applicazione UWP.

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

Questa tabella elenca i parametri per .createpackageapp.

Parametro Descrizione
<PLMPackageName> Nome del pacchetto dell'applicazione. Usare il comando .querypackages per elencare tutte le applicazioni UWP. Non fornire un percorso al percorso del pacchetto, specificare solo il nome del pacchetto.
<ApplicationId>

ApplicationId può essere situato usando .querypackage o .querypackages come illustrato in precedenza in questo argomento.

Per altre informazioni sul file manifesto dell'applicazione, vedere Manifesto del pacchetto app.

[<parametri>] Parametri facoltativi passati all'applicazione. Non tutte le applicazioni richiedono o usano questi parametri facoltativi.

Esempio:

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

Abilitazione e disabilitazione dell'uso dei comandi di debug

.enablepackagedebug

Il comando .enablepackagedebug abilita il debug per l'applicazione UWP. È necessario usare .enablepackagedebug prima di chiamare una delle funzioni di sospensione, ripresa o termina.

Si noti che il comando .createpackageapp abilita anche il debug dell'app.

.enablepackagedebug <PLMPackageName>

Esempio:

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

.disablepackagedebug

Il comando .disablepackagedebug disabilita il debug per l'applicazione UWP.

.disablepackagedebug <PLMPackageName>

Esempio:

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

Avvio e arresto delle app

Si noti che sospendere, riprendere e terminare influiscono su tutte le app attualmente in esecuzione nel pacchetto.

.suspendpackage

Il comando .suspendpackage sospende un'applicazione UWP.

.suspendpackage <PLMPackageName> 

Esempio:

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

.resumepackage

Il comando con estensione resumepackage riprende un'applicazione UWP.

.resumepackage <PLMPackageName> 

Esempio:

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

.terminatepackageapp

Il comando .terminatepackageapp termina tutte le applicazioni UWP nel pacchetto.

.terminatepackageapp <PLMPackageName> 

Esempio:

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

Attività di background

.activatepackagebgtask

Il comando .activatepackagebgtask abilita il debug e avvia un'attività in background UWP.

 .activatepackagebgtask <PLMPackageName> <bgTaskId>

Esempio:

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

Esempi di utilizzo

Collegare un debugger al momento dell'avvio dell'app

Si supponga di avere un'app denominata HelloWorld in un pacchetto denominato e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0.x86__97ghe447vaan8. Verificare che il pacchetto sia installato visualizzando i nomi completi ed eseguendo tutti i pacchetti installati. In una finestra del prompt dei comandi immettere il comando seguente. È possibile usare CTRL+F per cercare l'output del comando per il nome dell'app 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

...

Usare .createpackageapp per avviare e collegare l'app. Il comando .createpackageapp consente anche il debug dell'app.

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

Al termine del debug, decrerere il conteggio dei riferimenti di debug per il pacchetto usando il comando .disablepackagedebug.

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

Collegare un debugger a un'app già in esecuzione

Si supponga di voler collegare WinDbg a MyApp, che è già in esecuzione. In WinDbg scegliere Collega a un processo dal menu File. Prendere nota dell'ID processo per MyApp. Si supponga che l'ID processo sia 4816. Incrementare il numero di riferimenti di debug per il pacchetto contenente MyApp.

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

In WinDbg, nella finestra di dialogo Collega a processo selezionare processo 4816 e fare clic su OK. WinDbg allegherà a MyApp.

Al termine del debug, decrerere il conteggio dei riferimenti di debug per il pacchetto usando il comando .disablepackagedebug.

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

Sospendere manualmente e riprendere l'app

Seguire questa procedura per sospendere manualmente e riprendere l'app. Incrementare prima di tutto il numero di riferimenti di debug per il pacchetto che contiene l'app.

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

Sospendere il pacchetto. Il gestore di sospensione dell'app viene chiamato, che può essere utile per il debug.

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

Al termine del debug, riprendere il pacchetto.

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

Infine, decrementare il conteggio dei riferimenti di debug per il pacchetto.

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

Vedere anche