使用 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__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" />
在清单中查找应用程序 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
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈