Compartilhar via


Depurar um aplicativo UWP usando WinDbg

Você pode depurar o aplicativo UWP (Plataforma Universal do Windows) usando o WinDbg. Esta abordagem geralmente será usada para cenários avançados, nos quais não é possível concluir a tarefa de depuração usando o depurador interno do Visual Studio. Para obter mais informações sobre como depurar no Visual Studio, confira Depurar no Visual Studio.

Anexar a um aplicativo UWP

Anexar ao processo UWP é o mesmo que anexar a um processo de modo de usuário. Por exemplo, no WinDbg, você pode anexar a um processo em execução escolhendo Anexar a um processo no menu Arquivo ou pressionando F6. Para obter mais informações, confira Depurar um processo de modo de usuário usando o WinDbg.

Um aplicativo UWP não será suspenso da mesma forma que quando não estiver sendo depurado. Para suspender/retomar explicitamente um aplicativo UWP, você poderá usar os comandos .suspendpackage e .resumepackage (detalhes abaixo). Para obter informações gerais sobre o PLM (Gerenciamento do Ciclo de Vida do Processo) usado por aplicativos UWP, confira Ciclo de vida do aplicativo e Iniciar, retomar e tarefas em segundo plano.

Iniciar e depurar um aplicativo UWP

Os parâmetros de linha de comando -plmPackage e -plmApp instruem o depurador a iniciar um aplicativo no depurador.

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

Como vários aplicativos podem estar contidos em um único pacote, os parâmetros <PLMPackage> e <ApplicationId> são obrigatórios. Este é um resumo dos parâmetros.

Parâmetro Descrição
<PLMPackageName> O nome do pacote de aplicativos. Use o comando .querypackages para listar todos os aplicativos UWP. Não forneça um caminho para o local do pacote, forneça apenas o nome do pacote.
<ApplicationId>

O ApplicationId está localizado no arquivo de manifesto do aplicativo e pode ser exibido usando o comando .querypackage ou .querypackages, conforme discutido neste tópico.

Para obter mais informações sobre o arquivo de manifesto do aplicativo, confira Manifesto do pacote de aplicativos.

[<parâmetros>]

Parâmetros opcionais passados para o aplicativo. Nem todos os aplicativos usam ou exigem parâmetros.

Exemplo de HelloWorld

Para demonstrar a depuração UWP, este tópico usa o exemplo HelloWorld descrito em Criar um aplicativo "Olá, Mundo" (XAML).

Para criar um aplicativo de teste viável, só é necessário concluir até a etapa três do laboratório.

Localizar o nome completo do pacote e AppId

Use o comando .querypackages para localizar o nome completo do pacote e o AppId. Digite .querypackages e se as teclas CRTL+F para pesquisar na saída o nome do aplicativo, como HelloWorld. Quando a entrada for localizada usando CTRL+F, ela mostrará o nome completo do pacote (por exemplo, e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8) e o AppId de App.

Exemplo:

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

Exibir o nome do pacote base no manifesto

Para solução de problemas, convém exibir o nome do pacote base no Visual Studio.

Para localizar o nome do pacote base no Visual Studio, clique no arquivo ApplicationManifest.xml no explorador de projetos. O nome do pacote base será exibido na guia de empacotamento como "Nome do pacote". Por padrão, o nome do pacote será um GUID; por exemplo, e24caf14-8483-4743-b80c-ca46c28c75df.

Para usar o bloco de notas para localizar o nome do pacote base, abra o arquivo ApplicationManifest.xml e localize a marcação Nome da Identidade.

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

Localizar a ID do aplicativo no manifesto

Para localizar a ID do Aplicativo no arquivo de manifesto de um aplicativo UWP instalado, procure a entrada ID do Aplicativo.

Por exemplo, para o aplicativo hello world, a ID do Aplicativo é App.

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

Exemplo de linha de comando WinDbg

Este é um exemplo de linha de comando ao carregar o aplicativo HelloWorld no depurador usando o nome completo do pacote e o AppId.

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

Iniciar uma tarefa em segundo plano no depurador

Uma tarefa em segundo plano pode ser explicitamente iniciada no depurador a partir da linha de comando usando o TaskId. Para fazer isso, use os parâmetros de linha de comando -plmPackage e -plmBgTaskId:

windbg.exe -plmPackage <PLMPackageName> -plmBgTaskId <BackgroundTaskId>
Parâmetro Descrição
<PLMPackageName>

O nome do pacote de aplicativos. Use o comando .querypackages para listar todos os aplicativos UWP. Não forneça um caminho para o local do pacote, forneça apenas o nome do pacote.

<BackgroundTaskId>

O parâmetro BackgroundTaskId pode ser localizado usando o comando .querypackages, conforme descrito abaixo.

Para obter mais informações sobre o arquivo de manifesto do aplicativo, confira Manifesto do pacote de aplicativos.

Este é um exemplo de carregamento do código SDKSamples.BackgroundTask no depurador.

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

Você pode experimentar o código de exemplo da Tarefa em segundo plano para se familiarizar com a depuração UWP. Ele pode ser baixado em Exemplo de tarefa em segundo plano.

Use o comando .querypackages para localizar o parâmetro BackgroundTaskId. Use CTRL-F para localizar o aplicativo e, em seguida, localize o campo ID da Tarefa em Segundo Plano. A tarefa em segundo plano deve estar em execução para exibir o nome da tarefa em segundo plano e a ID da tarefa associada.

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 você souber o nome completo do pacote, poderá usar .querypackage para exibir o campo ID da Tarefa em Segundo Plano.

Você também pode localizar o parâmetro BackgroundTaskId usando a opção enumerateBgTasks do PLMDebug. Para obter mais informações sobre o utilitário PMLDebug, confira 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

Depurar um processo UWP remotamente usando um Servidor de Processo (DbgSrv)

Todos os comandos -plm* funcionam corretamente com dbgsrv. Para depurar usando dbgsrv, use a opção -premote com a cadeia de conexão 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 obter mais informações sobre as opções -premote, confira Servidores de Processo (Modo de Usuário) e Exemplos de Servidor de Processo.

Resumo dos comandos do aplicativo UWP

Esta seção fornece um resumo dos comandos do depurador de aplicativo UWP.

Coletar informações do pacote

.querypackage

O .querypackage exibe o estado de um aplicativo UWP. Por exemplo, se o aplicativo estiver em execução, poderá estar no estado Ativo.

.querypackage <PLMPackageName>

Exemplo:

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

O comando .querypackages lista todos os aplicativos UWP instalados e seu estado atual.

.querypackages

Exemplo:

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

...

Iniciar um aplicativo para depuração

.createpackageapp

O comando .createpackageapp habilita a depuração e inicia um aplicativo UWP.

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

Esta tabela lista os parâmetros para .createpackageapp.

Parâmetro Descrição
<PLMPackageName> O nome do pacote de aplicativos. Use o comando .querypackages para listar todos os aplicativos UWP. Não forneça um caminho para o local do pacote, forneça apenas o nome do pacote.
<ApplicationId>

O ApplicationId pode ser localizado usando .querypackage ou .querypackages, conforme discutido anteriormente neste tópico.

Para obter mais informações sobre o arquivo de manifesto do aplicativo, confira Manifesto do pacote de aplicativos.

[<parâmetros>] Parâmetros opcionais que são passados para o aplicativo. Nem todos os aplicativos exigem ou usam esses parâmetros opcionais.

Exemplo:

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

Habilitar e desabilitar o uso de comandos de depuração

.enablepackagedebug

O comando .enablepackagedebug habilita a depuração do aplicativo UWP. Você deve usar .enablepackagedebug antes de chamar qualquer uma das funções de suspender, retomar ou encerrar.

O comando .createpackageapp também habilita a depuração do aplicativo.

.enablepackagedebug <PLMPackageName>

Exemplo:

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

.disablepackagedebug

O comando .disablepackagedebug desabilita a depuração do aplicativo UWP.

.disablepackagedebug <PLMPackageName>

Exemplo:

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

Iniciar e parar os aplicativos

Observe que suspender, retomar e encerrar afetam todos os aplicativos atualmente em execução no pacote.

.suspendpackage

O comando .suspendpackage suspende um aplicativo UWP.

.suspendpackage <PLMPackageName> 

Exemplo:

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

.resumepackage

O comando .resumepackage retoma um aplicativo UWP.

.resumepackage <PLMPackageName> 

Exemplo:

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

.terminatepackageapp

O comando .terminatepackageapp encerra todos os aplicativos UWP no pacote.

.terminatepackageapp <PLMPackageName> 

Exemplo:

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

Tarefas em segundo plano

.activatepackagebgtask

O comando .activatepackagebgtask habilita a depuração e inicia uma tarefa em segundo plano do UWP.

 .activatepackagebgtask <PLMPackageName> <bgTaskId>

Exemplo:

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

Exemplos de uso

Anexar um depurador quando o aplicativo for iniciado

Suponha que você tenha um aplicativo chamado de HelloWorld que esteja em um pacote nomeado e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8. Verifique se o pacote está instalado exibindo os nomes completos e os estados de execução de todos os pacotes instalados. Em uma janela do Prompt de Comando, digite o comando a seguir. Você pode usar CTRL+F para pesquisar a saída do comando para o nome do aplicativo 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 e anexar ao aplicativo. O comando .createpackageapp também habilita a depuração do aplicativo.

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

Quando você tiver concluído a depuração, reduza a contagem de referência de depuração do pacote usando o comando .disablepackagedebug.

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

Anexar um depurador a um aplicativo que já está em execução

Suponha que você queira anexar o WinDbg a MyApp, que já está em execução. No WinDbg, no menu Arquivo, escolha Anexar a um Processo. Anote a ID do processo para MyApp. Digamos que a ID do processo seja 4816. Incremente a contagem de referência de depuração para o pacote que contém MyApp.

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

No WinDbg, na caixa de diálogo Anexar ao Processo, selecione o processo 4816 e clique em OK. O WinDbg será anexado ao MyApp.

Quando você tiver concluído a depuração, reduza a contagem de referência de depuração do pacote usando o comando .disablepackagedebug.

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

Suspender e retomar manualmente o aplicativo

Siga estas etapas para suspender e retomar manualmente o aplicativo. Primeiro, incremente a contagem de referência de depuração para o pacote que contém o aplicativo.

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

Suspenda o pacote. O manipulador de suspensão do aplicativo é chamado, o que pode ser útil para a depuração.

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

Quando terminar a depuração, retome o pacote.

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

Por fim, reduza a contagem de referência de depuração do pacote.

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

Consulte também