Отладка приложения UWP с помощью WinDbg

Вы можете отлаживать приложение универсальная платформа Windows (UWP) с помощью WinDbg. Этот подход обычно используется в сложных сценариях, где невозможно выполнить задачу отладки с помощью встроенного отладчика Visual Studio. Дополнительные сведения об отладке в Visual Studio см. в разделе Отладка в Visual Studio.

Подключение к приложению UWP

Присоединение к процессу UWP аналогично присоединению к процессу пользовательского режима. Например, в WinDbg можно присоединиться к выполняющимся процессам, выбрав в меню Файл пункт Присоединиться к процессу или нажав клавишу F6. Дополнительные сведения см. в разделе Отладка процесса User-Mode с помощью WinDbg.

Приложение UWP не будет приостановлено так же, как при отладке. Чтобы явно приостановить или возобновить работу приложения UWP, можно использовать команды suspendpackage и .resumepackage (подробные сведения см. ниже). Общие сведения об управлении жизненным циклом процессов (PLM), используемом приложениями UWP, см. в статье Жизненный цикл приложений и запуск, возобновление и фоновые задачи.

Запуск и отладка приложения UWP

Параметры командной строки -plmPackage и -plmApp указывают отладчику запустить приложение в отладчике.

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

Так как в одном пакете может содержаться несколько приложений, требуются параметры <PLMPackage> и <ApplicationId> . Это сводка параметров.

Параметр Описание
<PLMPackageName> Имя пакета приложения. Используйте команду .querypackages, чтобы получить список всех приложений UWP. Не указывайте путь к расположению пакета, укажите только имя пакета.
<ApplicationId>

ApplicationId находится в файле манифеста приложения и может быть просмотрен с помощью команды .querypackage или .querypackages, как описано в этом разделе.

Дополнительные сведения о файле манифеста приложения см. в разделе Манифест пакета приложения.

[<параметры>]

Необязательные параметры, передаваемые в приложение. Не все приложения используют или требуют параметры.

Пример HelloWorld

Чтобы продемонстрировать отладку UWP, в этом разделе используется пример HelloWorld, описанный в разделе Создание приложения "Hello, world" (XAML).

Чтобы создать работоспособное тестовое приложение, необходимо выполнить только третий шаг лаборатории.

Поиск полного имени пакета и идентификатора приложения

Используйте команду .querypackages, чтобы найти полное имя пакета и AppId. Введите .querypackages, а затем пользователь CRTL+F, чтобы найти в выходных данных имя приложения, например HelloWorld. Если запись находится с помощью клавиш CTRL+F, она отображает полное имя пакета, например e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86_97ghe447vaan8 и AppId приложения.

Пример

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

Просмотр имени базового пакета в в манифесте

Для устранения неполадок может потребоваться просмотреть имя базового пакета в Visual Studio.

Чтобы найти имя базового пакета в Visual Studio, щелкните файл ApplicationManifest.xml в обозревателе проектов. Имя базового пакета будет отображаться на вкладке упаковки как "Имя пакета". По умолчанию именем пакета будет GUID, например e24caf14-8483-4743-b80c-ca46c28c75df.

Чтобы найти имя базового пакета с помощью Блокнота, откройте файл ApplicationManifest.xml и найдите тег Identity Name .

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

Поиск идентификатора приложения в манифесте

Чтобы найти идентификатор приложения в файле манифеста установленного приложения UWP, найдите запись Идентификатор приложения .

Например, для приложения hello world идентификатором приложения является Приложение.

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

Пример командной строки WinDbg

Это пример командной строки, загружающего приложение HelloWorld в отладчике с использованием полного имени пакета и AppId.

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

Запуск фоновой задачи в отладчике

Фоновую задачу можно явно запустить в отладчике из командной строки с помощью TaskId. Для этого используйте параметры командной строки -plmPackage и -plmBgTaskId:

windbg.exe -plmPackage <PLMPackageName> -plmBgTaskId <BackgroundTaskId>
Параметр Описание
<PLMPackageName>

Имя пакета приложения. Используйте команду .querypackages, чтобы получить список всех приложений UWP. Не указывайте путь к расположению пакета, укажите только имя пакета.

<BackgroundTaskId>

BackgroundTaskId можно найти с помощью команды .querypackages, как описано ниже.

Дополнительные сведения о файле манифеста приложения см. в разделе Манифест пакета приложения.

Это пример загрузки кода SDKSamples.BackgroundTask в отладчик.

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

Вы можете поэкспериментировать с примером кода фоновой задачи, чтобы ознакомиться с отладкой UWP. Его можно скачать в разделе Пример фоновой задачи.

Используйте команду .querypackages, чтобы найти BackgroundTaskId. Нажмите клавиши CTRL+F, чтобы найти приложение, а затем найдите поле Идентификатор фоновой задачи . Фоновая задача должна быть запущена, чтобы отобразить имя и идентификатор задачи, связанные с фоновой задачей.

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

Если вы знаете полное имя пакета, можно использовать .querypackage для отображения поля Идентификатор фоновой задачи .

Вы также можете найти BackgroundTaskId с помощью параметра enumerateBgTasks plMDebug. Дополнительные сведения о utiltity PMLDebug см. в разделе 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

Удаленная отладка процесса UWP с помощью сервера обработки (DbgSrv)

Все команды -plm* правильно работают с dbgsrv. Для отладки с помощью dbgsrv используйте параметр -premote с строка подключения для dbgsrv:

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

Дополнительные сведения о параметрах -premote см. в разделах Серверы обработки (режим пользователя) и Примеры серверов обработки.

Сводка по командам приложения UWP

В этом разделе представлена сводка команд отладчика приложений UWP

Сбор сведений о пакете

.querypackage

В .querypackage отображается состояние приложения UWP. Например, если приложение запущено, оно может находиться в активном состоянии.

.querypackage <PLMPackageName>

Пример

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

Команда .querypackages выводит список всех установленных приложений UWP и их текущее состояние.

.querypackages

Пример

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

...

Запуск приложения для отладки

.createpackageapp

Команда .createpackageapp включает отладку и запускает приложение UWP.

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

В этой таблице перечислены параметры для .createpackageapp.

Параметр Описание
<PLMPackageName> Имя пакета приложения. Используйте команду .querypackages, чтобы получить список всех приложений UWP. Не указывайте путь к расположению пакета, укажите только имя пакета.
<ApplicationId>

ApplicationId можно найти с помощью .querypackage или .querypackages, как описано ранее в этом разделе.

Дополнительные сведения о файле манифеста приложения см. в разделе Манифест пакета приложения.

[<параметры>] Необязательные параметры, передаваемые в приложение. Не все приложения требуют или используют эти необязательные параметры.

Пример

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

Включение и отключение использования команд отладки

.enablepackagedebug

Команда .enablepackagedebug включает отладку для приложения UWP. Перед вызовом любой из функций приостановки, возобновления или завершения необходимо использовать .enablepackagedebug.

Обратите внимание, что команда .createpackageapp также включает отладку приложения.

.enablepackagedebug <PLMPackageName>

Пример

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

.disablepackagedebug

Команда .disablepackagedebug отключает отладку для приложения UWP.

.disablepackagedebug <PLMPackageName>

Пример

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

Запуск и остановка приложений

Обратите внимание, что приостановка, возобновление и завершение работы влияют на все запущенные в данный момент приложения в пакете.

.suspendpackage

Команда .suspendpackage приостанавливает приложение UWP.

.suspendpackage <PLMPackageName> 

Пример

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

.resumepackage

Команда .resumepackage возобновляет работу приложения UWP.

.resumepackage <PLMPackageName> 

Пример

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

.terminatepackageapp

Команда .terminatepackageapp завершает работу всех приложений UWP в пакете.

.terminatepackageapp <PLMPackageName> 

Пример

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

Фоновые задачи

.activatepackagebgtask

Команда .activatepackagebgtask включает отладку и запускает фоновую задачу UWP.

 .activatepackagebgtask <PLMPackageName> <bgTaskId>

Пример

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

Примеры использования

Подключение отладчика при запуске приложения

Предположим, у вас есть приложение с именем HelloWorld, которое находится в пакете с именем e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0_x86__97ghe447vaan8. Убедитесь, что пакет установлен, отобразив полные имена и состояния выполнения всех установленных пакетов. В окне командной строки введите следующую команду. Для поиска имени приложения HelloWorld в выходных данных команды можно использовать клавиши CTRL+F.

.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

...

Используйте .createpackageapp для запуска и присоединения к приложению. Команда .createpackageapp также включает отладку приложения.

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

Завершив отладку, уменьшайте количество отладочных ссылок для пакета с помощью команды .disablepackagedebug.

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

Подключение отладчика к уже работающему приложению

Предположим, вы хотите подключить WinDbg к MyApp, которое уже запущено. В WinDbg в меню Файл выберите Присоединить к процессу. Запишите идентификатор процесса для MyApp. Предположим, что идентификатор процесса — 4816. Увеличение количества ссылок на отладку для пакета, содержащего MyApp.

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

В WinDbg в диалоговом окне Присоединение к процессу выберите процесс 4816 и нажмите кнопку ОК. WinDbg присоединится к MyApp.

Завершив отладку, уменьшайте количество отладочных ссылок для пакета с помощью команды .disablepackagedebug.

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

Приостановка и возобновление работы приложения вручную

Выполните следующие действия, чтобы вручную приостановить и возобновить работу приложения. Сначала необходимо увеличить число отладочных ссылок для пакета, содержащего ваше приложение.

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

Приостановить пакет. Вызывается обработчик приостановки приложения, который может быть полезен для отладки.

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

Завершив отладку, возобновите пакет.

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

Наконец, уменьшается количество отладочных ссылок для пакета.

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

См. также