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>]
1 つのパッケージ内に複数のアプリを含めることができるため、<PLMPackage> パラメーターと <ApplicationId> パラメーターの両方が必要です。 以下にパラメーターの概要をまとめます。
パラメーター | 説明 |
<PLMPackageName> | アプリケーション パッケージの名前。 .querypackages コマンドを使用して、すべての UWP アプリケーションを一覧表示します。 パッケージの場所へのパスは指定せず、パッケージ名のみを指定します。 |
<ApplicationId> | ApplicationId はアプリケーション マニフェスト ファイル内にあり、このトピックで説明するように .querypackage または .querypackages コマンドを使用して表示できます。 アプリケーション マニフェスト ファイルの詳細については、「アプリ パッケージ マニフェスト」を参照してください。 |
[<パラメーター>] | アプリに渡される省略可能なパラメーター。 すべてのアプリがパラメーターを使用または要求するわけではありません。 |
HelloWorld サンプル
このトピックでは、UWP のデバッグの状況を示すために、「"Hello, world" アプリを作成する (XAML)」で説明されている HelloWorld の例を使用します。
ラボの手順 3 までを完了すれば、実行可能なテスト アプリを作成できます。
完全なパッケージ名と AppId の検索
.querypackages コマンドを使用して、完全なパッケージ名と AppId を見つけます。 「.querypackages」と入力し、CRTL+F キーを押して、HelloWorld などのアプリケーション名の出力を検索します。 CTRL+F キーを使用してエントリが見つかると、パッケージの完全な名前 (e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8 など) と App の 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] タグを見つけます。
<Identity
Name="e24caf14-8483-4743-b80c-ca46c28c75df"
Publisher="CN= User1"
Version="1.0.0.0" />
マニフェストでのアプリケーション ID の検索
インストールされている UWP アプリのマニフェスト ファイルでアプリケーション ID を見つけるには、[Application Id] エントリを探します。
たとえば、hello world アプリの場合、アプリケーション ID は 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 デバッグに習熟することができます。 Background task sample でダウンロードできます。
.querypackages コマンドを使用して、BackgroundTaskId を見つけます。 CTRL-F キーを使用してアプリを見つけ、[Background Task 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 を使用して [Background Task Id] フィールドを表示できます。
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
プロセス サーバー (DbgSrv) を使用した、リモートでの UWP プロセスのデバッグ
すべての -plm* コマンドは、dbgsrv で正しく動作します。 dbgsrv を使用してデバッグするには、dbgsrv の接続文字列を指定して -premote スイッチを使用します。
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 を使用して見つけることができます。 アプリケーション マニフェスト ファイルの詳細については、「アプリ パッケージ マニフェスト」を参照してください。 |
[<パラメーター>] | アプリケーションに渡される省略可能なパラメーター。 すべてのアプリケーションで、これらの省略可能なパラメーターが要求または使用されるわけではありません。 |
例:
.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}
使用例
アプリの起動時にデバッガーをアタッチする
e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8 という名前のパッケージに HelloWorld という名前のアプリがあるとします。 インストールされているすべてのパッケージの完全な名前と実行状態を表示して、パッケージがインストールされていることを確認します。 コマンド プロンプト ウィンドウで、次のコマンドを入力します。 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
既に実行されているアプリにデバッガーをアタッチする
既に実行中の MyApp に WinDbg をアタッチするとします。 WinDbg で、 [ファイル] メニューの [プロセスへのアタッチ] を選択します。 MyApp のプロセス ID をメモします。 プロセス ID が 4816 であるとします。 MyApp を含むパッケージのデバッグ参照カウントをインクリメントします。
.enablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
WinDbg の [プロセスへのアタッチ] ダイアログ ボックスで、プロセス 4816 を選択し、[OK] をクリックします。 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