Depuración de una aplicación para UWP con WinDbg

Puedes depurar Plataforma universal de Windows aplicación (UWP) con WinDbg. Este enfoque se usaría normalmente 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 la depuración en Visual Studio, vea Depuración en Visual Studio.

Asociación a una aplicación para UWP

La asociación al proceso de UWP es la misma que la asociación a un proceso de modo de usuario. Por ejemplo, en WinDbg puedes asociar a un proceso en ejecución si elige Asociar a un proceso en el menú Archivo o presionando F6. Para obtener más información, consulte Depuración de un proceso de User-Mode con 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, puedes 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, consulta 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 los parámetros PLMPackage> y <ApplicationId> . Se trata de un resumen de los parámetros.

Parámetro Descripción
<PLMPackageName> Nombre del paquete de 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 aplicación, consulte Manifiesto del paquete de aplicación.

[<parámetros>]

Parámetros opcionales pasados a la aplicación. No todas las aplicaciones usan o requieren parámetros.

Ejemplo HelloWorld

Para demostrar la depuración de UWP, en este tema se usa el ejemplo HelloWorld descrito en Creación de una aplicación "Hola mundo" (XAML).

Para crear una aplicación de prueba que funcione, solo es necesario completar hasta el paso tres del laboratorio.

Buscar el nombre completo del paquete y appId

Use el comando .querypackages para buscar el nombre completo del paquete y el AppId. Escriba .querypackages y, a continuación, user CRTL+F para buscar en la salida el nombre de la aplicación, como HelloWorld. Cuando la entrada se encuentra con CTRL+F, se mostrará el nombre completo del paquete, por ejemplo e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8 y appId de 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
...

Ver el nombre del paquete base en en el manifiesto

Para solucionar problemas, puede 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" />

Buscar el 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 Id. de aplicación .

Por ejemplo, para la aplicación hello world, 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 HelloWorld 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

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

Nombre del paquete de 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 aplicación, consulte Manifiesto del paquete de 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}

Puedes experimentar con el código de ejemplo de tarea en segundo plano para familiarizarte con la depuración de UWP. Se puede descargar en ejemplo de tarea 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 Id. de tarea en segundo plano . La tarea en segundo plano debe ejecutarse para mostrar el nombre de la tarea en segundo plano asociado y el identificador de 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 Id. de tarea en segundo plano .

También puede localizar 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, vea 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

El .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 muestra 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 la 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> Nombre del paquete de 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 aplicación, consulte Manifiesto del paquete de aplicación.

[<parámetros>] 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 de 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 la suspensión, reanudación y finalización afectan 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

Adjuntar un depurador cuando se inicia la aplicación

Supongamos que tiene una aplicación denominada HelloWorld que se encuentra en un paquete denominado e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0_x86__97ghe447vaan8. Compruebe que el paquete está instalado mostrando los nombres completos y los estados en ejecución de todos los paquetes instalados. En una ventana del símbolo del sistema, escriba el siguiente comando. Puede usar CTRL+F para buscar en la salida del comando el nombre de la aplicación de 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

...

Use .createpackageapp para iniciar y adjuntar 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, disminuya 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 Adjuntar 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 para el 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 proceso 4816 y haga clic en Aceptar. WinDbg se asociará a MyApp.

Cuando haya terminado de depurar, disminuya 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

Suspender y reanudar manualmente 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, que puede ser ú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, disminuye el recuento de referencias de depuración para el paquete.

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

Vea también