Поделиться через


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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример HelloWorld

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

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

Поиск имени полного пакета и AppId

Используйте команду querypackages, чтобы найти полное имя пакета и Идентификатор приложения. Введите .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="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>
Параметр Description
<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 с помощью параметра перечисленияBgTasks plMDebug. Дополнительные сведения о служебной программе 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

В запросе отображается состояние приложения 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.

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

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

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

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

Пример:

.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.0_x86__97ghe447vaan8. Убедитесь, что пакет установлен, отображая полные имена и выполняя состояния всех установленных пакетов. В окне командной строки введите следующую команду. Вы можете использовать CTRL+F для поиска выходных данных команды для имени приложения 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

...

Используйте .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

См. также