Depuración de una aplicación para UWP con WinDbg
Puedes depurar la aplicación Plataforma universal de Windows (UWP) mediante WinDbg. Este enfoque normalmente se usaría para escenarios avanzados, donde no es posible completar la tarea de depuración mediante el depurador integrado de Visual Studio. Para obtener más información sobre cómo depurar en Visual Studio, consulte Depuración en Visual Studio.
Asociación a una aplicación para UWP
El proceso de asociación a UWP es el mismo que la asociación a un proceso en modo de usuario. Por ejemplo, en WinDbg puede asociar a un proceso en ejecución seleccionando el menú Asociar a un proceso desde Archivo o pulsando F6. Para obtener más información, consulte Depuración de un proceso en modo de usuario mediante WinDbg.
Una aplicación para UWP no se suspenderá de la misma manera que cuando no se depura. Para suspender o reanudar explícitamente una aplicación para UWP, puede usar los comandos .suspendpackage y .resumepackage (detalles a continuación). Para obtener información general sobre la administración del ciclo de vida de los procesos (PLM) que usan las aplicaciones para UWP, consulte Ciclo de vida de la aplicación e Inicio, reanudación y tareas en segundo plano.
Inicio y depuración de una aplicación para UWP
Los parámetros de línea de comandos -plmPackage y -plmApp indican al depurador que inicie una aplicación en el depurador.
windbg.exe -plmPackage <PLMPackageName> -plmApp <ApplicationId> [<parameters>]
Dado que se pueden incluir varias aplicaciones dentro de un único paquete, se requieren parámetros <PLMPackage> y <ApplicationId>. Este es un resumen de los parámetros.
Parámetro | Descripción |
<PLMPackageName> | El nombre del paquete de la aplicación. Usa el comando .querypackages para enumerar todas las aplicaciones para UWP. No proporcione una ruta de acceso a la ubicación del paquete, proporcione solo el nombre del paquete. |
<ApplicationId> | ApplicationId se encuentra en el archivo de manifiesto de aplicación y se puede ver mediante el comando .querypackage o .querypackages, como se describe en este tema. Para obtener más información sobre el archivo de manifiesto de la aplicación, consulte Manifiesto del paquete de la aplicación. |
[<parameters>] | Parámetros opcionales pasados a la aplicación. No todas las aplicaciones usan o requieren parámetros. |
Ejemplo de Hola mundo:
Para demostrar la depuración de UWP, en este tema se usa el ejemplo de Hola mundo descrito en Creación de una aplicación de "Hola mundo" (XAML).
Para crear una aplicación de prueba que funcione, solo es necesario completar hasta el paso tres del laboratorio.
Búsqueda del nombre completo del paquete y el ID de la aplicación
Use el comando .querypackages para buscar el nombre completo del paquete y appId. Escriba .querypackages y, a continuación, pulse CRTL+F para buscar en la salida el nombre de la aplicación, como Hola Mundo. Cuando la entrada se encuentra con CTRL+F, mostrará el nombre completo del paquete, por ejemplo e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8 y el AppId App.
Ejemplo:
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
...
Visualización del nombre del paquete base en el manifiesto
Para solucionar problemas, es posible que desee ver el nombre del paquete base en Visual Studio.
Para buscar el nombre del paquete base en Visual Studio, haga clic en el archivo ApplicationManifest.xml en el Explorador de proyectos. El nombre del paquete base se mostrará en la pestaña de empaquetado como "Nombre del paquete". De forma predeterminada, el nombre del paquete será un GUID, por ejemplo e24caf14-8483-4743-b80c-ca46c28c75df.
Para usar el Bloc de notas para buscar el nombre del paquete base, abra el archivo ApplicationManifest.xml y busque la etiqueta Nombre de identidad.
<Identity
Name="e24caf14-8483-4743-b80c-ca46c28c75df"
Publisher="CN= User1"
Version="1.0.0.0" />
Búsqueda del identificador de aplicación en el manifiesto
Para buscar el identificador de aplicación en el archivo de manifiesto de una aplicación para UWP instalada, busque la entrada Application Id.
Por ejemplo, para la aplicación hola mundo, el identificador de aplicación es App.
<Application Id="App"
Executable="$targetnametoken$.exe"
EntryPoint="HelloWorld.App">
Línea de comandos de WinDbg de ejemplo
Se trata de una línea de comandos de ejemplo que carga la aplicación Hola mundo en el depurador mediante el nombre completo del paquete y AppId.
windbg.exe -plmPackage e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8 -plmApp App
Inicio de una tarea en segundo plano en el depurador
Una tarea en segundo plano se puede iniciar explícitamente en el depurador desde la línea de comandos mediante TaskId. Para ello, use los parámetros de línea de comandos -plmPackage y -plmBgTaskId:
windbg.exe -plmPackage <PLMPackageName> -plmBgTaskId <BackgroundTaskId>
Parámetro | Descripción |
<PLMPackageName> | El nombre del paquete de la aplicación. Usa el comando .querypackages para enumerar todas las aplicaciones para UWP. No proporcione una ruta de acceso a la ubicación del paquete, proporcione solo el nombre del paquete. |
<BackgroundTaskId> | BackgroundTaskId se puede encontrar mediante el comando .querypackages como se describe a continuación. Para obtener más información sobre el archivo de manifiesto de la aplicación, consulte Manifiesto del paquete de la aplicación. |
Este es un ejemplo de carga del código SDKSamples.BackgroundTask en el depurador.
windbg.exe -plmPackage Microsoft.SDKSamples.BackgroundTask.CPP_1.0.0.0_x64__8wekyb3d8bbwe -plmBgTaskId {ee4438ee-22db-4cdd-85e4-8ad8a1063523}
Puede experimentar con el código de ejemplo de tarea en segundo plano para familiarizarse con la depuración de UWP. Se puede descargar en el Ejemplo de tareas en segundo plano.
Use el comando .querypackages para buscar backgroundTaskId. Use CTRL-F para buscar la aplicación y, a continuación, busque el campo Background Task Id. La tarea en segundo plano debe ejecutarse para mostrar el nombre de la tarea en segundo plano asociado y el identificador de la tarea.
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 conoce el nombre completo del paquete, puede usar .querypackage para mostrar el campo Background Task Id.
También puede buscar BackgroundTaskId mediante la opción enumerateBgTasks de PLMDebug. Para obtener más información sobre la utilidad PMLDebug, consulte 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
Depuración de un proceso de UWP de forma remota mediante un servidor de procesos (DbgSrv)
Todos los comandos -plm* funcionan correctamente con dbgsrv. Para depurar mediante dbgsrv, use el modificador -premote con el cadena de conexión para dbgsrv:
windbg.exe -premote npipe:pipe=fdsa,server=localhost -plmPackage e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8 -plmApp App
Para obtener más información sobre las opciones de -premote, consulte Servidores de procesos (modo de usuario) y Ejemplos de servidor de procesos.
Resumen de los comandos de la aplicación para UWP
En esta sección se proporciona un resumen de los comandos del depurador de aplicaciones para UWP.
Recopilación de información del paquete
.querypackage
.querypackage muestra el estado de una aplicación para UWP. Por ejemplo, si la aplicación se está ejecutando, puede estar en estado Activo.
.querypackage <PLMPackageName>
Ejemplo:
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
El comando .querypackages enumera todas las aplicaciones para UWP instaladas y su estado actual.
.querypackages
Ejemplo:
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
...
Inicio de una aplicación para depuración
.createpackageapp
El comando .createpackageapp habilita la depuración e inicia una aplicación para UWP.
.createpackageapp <PLMPackageName> <ApplicationId> [<parameters>]
En esta tabla se enumeran los parámetros de .createpackageapp.
Parámetro | Descripción |
<PLMPackageName> | El nombre del paquete de la aplicación. Usa el comando .querypackages para enumerar todas las aplicaciones para UWP. No proporcione una ruta de acceso a la ubicación del paquete, proporcione solo el nombre del paquete. |
<ApplicationId> | ApplicationId se puede encontrar mediante .querypackage o .querypackages, como se explicó anteriormente en este tema. Para obtener más información sobre el archivo de manifiesto de la aplicación, consulte Manifiesto del paquete de la aplicación. |
[<parameters>] | Parámetros opcionales que se pasan a la aplicación. No todas las aplicaciones requieren ni usan estos parámetros opcionales. |
Ejemplo:
.createpackageapp e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8 App
Habilitación y deshabilitación del uso de comandos de depuración
.enablepackagedebug
El comando .enablepackagedebug habilita la depuración para la aplicación para UWP. Debe usar .enablepackagedebug antes de llamar a cualquiera de las funciones de suspensión, reanudación o finalización.
Tenga en cuenta que el comando .createpackageapp también habilita la depuración de la aplicación.
.enablepackagedebug <PLMPackageName>
Ejemplo:
.enablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
.disablepackagedebug
El comando .disablepackagedebug deshabilita la depuración para la aplicación para UWP.
.disablepackagedebug <PLMPackageName>
Ejemplo:
.disablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Inicio y detención de aplicaciones
Tenga en cuenta que suspender, reanudar y finalizar afecta a todas las aplicaciones que se ejecutan actualmente en el paquete.
.suspendpackage
El comando .suspendpackage suspende una aplicación para UWP.
.suspendpackage <PLMPackageName>
Ejemplo:
0:024> .suspendpackage e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
.resumepackage
El comando .resumepackage reanuda una aplicación para UWP.
.resumepackage <PLMPackageName>
Ejemplo:
.resumepackage e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
.terminatepackageapp
El comando .terminatepackageapp finaliza todas las aplicaciones para UWP del paquete.
.terminatepackageapp <PLMPackageName>
Ejemplo:
.terminatepackageapp e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Tareas en segundo plano
.activatepackagebgtask
El comando .activatepackagebgtask habilita la depuración e inicia una tarea en segundo plano de UWP.
.activatepackagebgtask <PLMPackageName> <bgTaskId>
Ejemplo:
.activatepackagebgtask Microsoft.SDKSamples.BackgroundTask.CPP_1.0.0.0_x64__8wekyb3d8bbwe {C05806B1-9647-4765-9A0F-97182CEA5AAD}
Ejemplos de uso
Asociación de un depurador cuando se inicia la aplicación
Supongamos que tiene una aplicación denominada Hola mundo que se encuentra en un paquete denominado e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8. Compruebe que el paquete está instalado mostrando los nombres completos y ejecutando los estados de todos los paquetes instalados. En una ventana del símbolo del sistema, escriba el siguiente comando. Puede usar CTRL+F para buscar la salida del comando para el nombre de la aplicación de Hola mundo.
.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
...
Use .createpackageapp para iniciar y asociar a la aplicación. El comando .createpackageapp también habilita la depuración de la aplicación.
.createpackageapp e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8 App
Cuando haya terminado de depurar, reduzca el recuento de referencias de depuración para el paquete mediante el comando .disablepackagedebug.
.disablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Asociación de un depurador a una aplicación que ya se está ejecutando
Supongamos que quiere asociar WinDbg a MyApp, que ya se está ejecutando. En WinDbg, en el menú Archivo, elija Asociar a un proceso. Anote el identificador de proceso de MyApp. Supongamos que el identificador de proceso es 4816. Incremente el recuento de referencias de depuración del paquete que contiene MyApp.
.enablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
En WinDbg, en el cuadro de diálogo Asociar al proceso, seleccione el proceso 4816 y haga clic en Aceptar. WinDbg se asociará a MyApp.
Cuando haya terminado de depurar, reduzca el recuento de referencias de depuración para el paquete mediante el comando .disablepackagedebug.
.disablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Suspensión y reanudación manuales de la aplicación
Siga estos pasos para suspender y reanudar manualmente la aplicación. En primer lugar incremente el recuento de referencias de depuración del paquete que contiene la aplicación.
.enablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Suspenda el paquete. Se llama al controlador de suspensión de la aplicación, lo que puede resultar útil para la depuración.
.suspendpackage e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Cuando haya terminado de depurar, reanude el paquete.
.resumepackage e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Por último, reduzca el recuento de referencias de depuración para el paquete.
.disablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8