Отладка приложения 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