Debug di un'app UWP con WinDbg
Puoi eseguire il debug di 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 equivale all'associazione a un processo in modalità utente. Ad esempio, in WinDbg è possibile collegarsi a un processo in esecuzione scegliendo Connetti a un processo dal menu File o premendo F6. Per altre informazioni, vedere Debug di un processo in modalità utente con 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, puoi usare i comandi .suspendpackage e resumepackage (dettagli di seguito). Per informazioni generali sulla gestione del ciclo di vita dei processi usata dalle app UWP, vedi Ciclo di vita delle app e 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é più app possono essere contenute all'interno di un singolo pacchetto, sono necessari entrambi <i parametri PLMPackage> e <ApplicationId> . Si tratta di un riepilogo dei parametri.
Parametro | Descrizione |
<PLMPackageName> | Nome del pacchetto dell'applicazione. Usare il comando .querypackages per elencare tutte le applicazioni UWP. Non specificare un percorso per il 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 descritto in questo argomento. Per altre informazioni sul file manifesto dell'applicazione, vedere Manifesto del pacchetto dell'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 3 del lab.
Individuazione del nome completo del pacchetto e dell'Id app
Usare il comando .querypackages per individuare il nome completo del pacchetto e l'AppId. Digitare .querypackages 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, mostrerà il nome completo del pacchetto, ad esempio e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8 e l'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 in 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 di creazione del pacchetto 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 Identity Name .
<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
Questa è 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 nel 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 specificare un percorso per il percorso del pacchetto, specificare solo il nome del pacchetto. |
<BackgroundTaskId> | BackgroundTaskId può essere individuato usando il comando .querypackages come descritto di seguito. Per altre informazioni sul file manifesto dell'applicazione, vedere Manifesto del pacchetto dell'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}
Puoi sperimentare il codice di esempio dell'attività in background per acquisire familiarità con il debug UWP. Può essere scaricato in 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 e l'ID attività associati.
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'utilità 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 modalità remota tramite un server di elaborazione (DbgSrv)
Tutti i comandi -plm* funzionano correttamente con dbgsrv. Per eseguire il debug con 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 Server di elaborazione (modalità utente) ed esempi di server di elaborazione.
Riepilogo dei comandi dell'app UWP
Questa sezione fornisce un riepilogo dei comandi del debugger di app UWP
Raccolta di informazioni sui pacchetti
.querypackage
Il pacchetto query visualizza lo stato di un'applicazione UWP. Ad esempio, se l'app è in esecuzione, può trovarsi 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 specificare un percorso per il percorso del pacchetto, specificare solo il nome del pacchetto. |
<ApplicationId> | ApplicationId può trovarsi usando .querypackage o .querypackages, come descritto in precedenza in questo argomento. Per altre informazioni sul file manifesto dell'applicazione, vedere Manifesto del pacchetto dell'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 qualsiasi delle funzioni suspend, resume o terminate.
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 .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à in 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 all'avvio dell'app
Si supponga di avere un'app denominata HelloWorld che si trova 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 e gli stati di esecuzione di tutti i pacchetti installati. In una finestra del prompt dei comandi immettere il comando seguente. È possibile usare CTRL+F per cercare nell'output del comando 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 allegare all'app. Il comando .createpackageapp abilita anche il debug dell'app.
.createpackageapp e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8 App
Al termine del debug, decrementare 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 Connetti a un processo dal menu File. Prendere nota dell'ID del processo per MyApp. Si supponga che l'ID processo sia 4816. Incrementare il numero di riferimenti di debug per il pacchetto che contiene MyApp.
.enablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Nella finestra di dialogo Connetti a processo in WinDbg selezionare processo 4816 e fare clic su OK. WinDbg verrà collegato a MyApp.
Al termine del debug, decrementare 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 e riprendere manualmente l'app
Seguire questa procedura per sospendere e riprendere manualmente l'app. Prima di tutto, incrementare il conteggio dei 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. Viene chiamato il gestore di sospensione dell'app, 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