使用 WinDbg 對 UWP 應用程式進行偵錯

您可以使用 WinDbg 對 通用 Windows 平台 (UWP) 應用程式進行偵錯。 這種方法通常用於進階案例,因為無法使用內建的Visual Studio調試程式來完成偵錯工作。 如需在Visual Studio中偵錯的詳細資訊,請參閱 在Visual Studio中偵錯。

附加至 UWP 應用程式

附加至 UWP 進程與附加至使用者模式程式相同。 例如,在 WinDbg 中,您可以從 [檔案] 選單選擇 [附加至進程] 或按 F6,以附加至執行中的進程。 如需詳細資訊,請參閱 使用 WinDbg 對使用者模式進程進行偵錯。

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

在指令清單中尋找應用程式識別碼

若要在已安裝 UWP 應用程式的指令清單檔中找到應用程式識別碼,請尋找 應用程式識別碼 專案。

例如,針對 hello world 應用程式,應用程式識別碼為 App

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

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 來顯示 [背景工作標識符 ] 字段。

您也可以使用 PLMDebug 的 enumerateBgTasks 選項來尋找 BackgroundTaskId。 如需 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 或 .querypackage 來找到。

如需應用程式指令清單檔案的詳細資訊,請參閱 應用程式套件指令清單

[<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 的進程識別碼。 假設進程標識碼是 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

另請參閱