使用 WinDbg 调试 UWP 应用

可以使用 WinDbg 调试通用 Windows 平台 (UWP) 应用。 此方法通常用于高级方案,其中无法使用内置 Visual Studio 调试器完成调试任务。 有关在 Visual Studio 中进行调试的详细信息,请参阅 在 Visual Studio 中调试

附加到 UWP 应用

附加到 UWP 进程与附加到用户模式进程相同。 例如,在 WinDbg 中,可以通过 从“文件 ”菜单中选择“附加到进程”或按 F6 来附加到正在运行的进程。 有关详细信息,请参阅 使用 WinDbg 调试 User-Mode 进程

UWP 应用不会以与未调试时相同的方式挂起。 若要显式挂起/恢复 UWP 应用,可以使用 .suspendpackage 和 .resumepackage 命令 (下面) 的详细信息。 有关 UWP 应用使用的进程生命周期管理 (PLM) 的常规信息,请参阅 应用生命周期启动、恢复和后台任务

启动和调试 UWP 应用

-plmPackage 和 -plmApp 命令行参数指示调试器在调试器下启动应用。

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

由于多个应用可以包含在单个包中, <因此需要 PLMPackage> 和 <ApplicationId> 参数。 这是参数的摘要。

参数 说明
<PLMPackageName> 应用程序包的名称。 使用 .querypackages 命令列出所有 UWP 应用程序。 不要提供包位置的路径,只提供包名称。
<ApplicationId>

ApplicationId 位于应用程序清单文件中,可以使用本主题中讨论的 .querypackage 或 .querypackages 命令进行查看。

有关应用程序清单文件的详细信息,请参阅 应用包清单

[<parameters>]

传递给应用的可选参数。 并非所有应用都使用或需要参数。

HelloWorld 示例

为了演示 UWP 调试,本主题使用 创建“Hello, world”应用 (XAML) 中所述的 HelloWorld 示例。

若要创建可行的测试应用,只需完成实验室的第三步。

查找完整包名称和 AppId

使用 .querypackages 命令查找完整的包名称和 AppId。 键入 .querypackages,然后用户 CRTL+F 在输出中搜索应用程序名称,例如 HelloWorld。 使用 CTRL+F 找到条目时,将显示包全名,例如 e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8AppId

例如:

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" />

在清单中查找应用程序 ID

若要在已安装的 UWP 应用的清单文件中查找应用程序 ID,请查找 “应用程序 ID” 条目。

例如,对于 hello world 应用,应用程序 ID 为 应用

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

WinDbg 命令行示例

这是使用完整包名称和 AppId 在调试器下加载 HelloWorld 应用的命令行示例。

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>

可以使用 .querypackages 命令找到 BackgroundTaskId,如下所述。

有关应用程序清单文件的详细信息,请参阅 应用包清单

这是在调试器下加载 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 查找应用,然后找到“ 后台任务 ID” 字段。 后台任务必须正在运行才能显示关联的后台任务名称和任务 ID。

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 显示 后台任务 ID 字段。

还可以使用 PLMDebug 的 enumerateBgTasks 选项找到 BackgroundTaskId。 有关 PMLDebug utiltity 的详细信息,请参阅 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

使用进程服务器 (DbgSrv) 远程调试 UWP 进程

所有 -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>

可以使用 .querypackage 或 .querypackages 找到 ApplicationId,如本主题前面所述。

有关应用程序清单文件的详细信息,请参阅 应用包清单

[<parameters>] 传递给应用程序的可选参数。 并非所有应用程序都需要或使用这些可选参数。

例如:

.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,该 MyApp 已在运行。 在 WinDbg 的“ 文件 ”菜单上,选择“ 附加到进程”。 记下 MyApp 的进程 ID。 假设进程 ID 为 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

另请参阅