UWP アプリと従来のデスクトップ アプリケーションの主な違いの 1 つは、UWP タイトルがプロセス ライフサイクル管理 (PLM) の対象となるアプリ コンテナーに存在することです。 UWP アプリは、ランタイム ブローカー サービスによってすべてのプラットフォームで一時停止、再開、または終了できます。また、それらを処理するコードをテストまたはデバッグするときに、それらの移行を強制するために使用する専用のツールがあります。
Visual Studio 2015 の機能
Visual Studio 2015 の組み込みデバッガーは、UWP 専用機能を使用する場合の潜在的な問題を調査するのに役立ちます。 ライフサイクル イベント ツール バーを使用して、アプリケーションをさまざまな PLM 状態に強制できます。このツール バーは、タイトルを実行してデバッグするときに表示されます。
PLMDebug ツール
PLMDebug.exe は、アプリケーション パッケージの PLM 状態を制御できるコマンドライン ツールであり、Windows SDK の一部として出荷されます。 インストール後、ツールは既定で C:\Program Files (x86)\Windows Kits\10\Debuggers\x64 に存在します。
PLMDebug を使用すると、一部のデバッガーに必要な、インストールされているアプリ パッケージに対して PLM を無効にすることもできます。 PLM を無効にすると、デバッグする前にランタイム ブローカー サービスがアプリを終了できなくなります。 PLM を無効にするには、/enableDebug スイッチを使用し、UWP アプリの 完全なパッケージ名 を使用します (パッケージの短い名前、パッケージ ファミリ名、または AUMID は機能しません)。
plmdebug /enableDebug [PackageFullName]
Visual Studio から UWP アプリを展開すると、完全なパッケージ名が出力ウィンドウに表示されます。 または、PowerShell コンソールで Get-AppxPackage
を実行中
必要に応じて、アプリ パッケージのアクティブ化時に自動的に起動するデバッガーへの絶対パスを指定できます。 Visual Studio を使用してこれを行う場合は、デバッガーとして VSJITDebugger.exe を指定する必要があります。 ただし、VSJITDebugger.exe では、UWP アプリのプロセス ID (PID) と共に "-p" スイッチを指定する必要があります。 UWP アプリの PID を事前に把握することはできないため、このシナリオをすぐに使用することはできません。
この制限を回避するには、ゲームのプロセスを識別するスクリプトまたはツールを記述し、シェルを VSJITDebugger.exe実行し、UWP アプリの PID を渡します。 次の C# コード サンプルは、これを実現するための簡単な方法を示しています。
using System.Diagnostics;
namespace VSJITLauncher
{
class Program
{
static void Main(string[] args)
{
// Name of UWP process, which can be retrieved via Task Manager.
Process[] processes = Process.GetProcessesByName(args[0]);
// Get PID of most recent instance
// Note the highest PID is arbitrary. Windows may recycle or wrap the PID at any time.
int highestId = 0;
foreach (Process detectedProcess in processes)
{
if (detectedProcess.Id > highestId)
highestId = detectedProcess.Id;
}
// Launch VSJITDebugger.exe, which resides in C:\Windows\System32
ProcessStartInfo startInfo = new ProcessStartInfo("vsjitdebugger.exe", "-p " + highestId);
startInfo.UseShellExecute = true;
Process process = new Process();
process.StartInfo = startInfo;
process.Start();
}
}
}
PLMDebug と組み合わせて使用する例:
plmdebug /enableDebug 279f7062-ce35-40e8-a69f-cc22c08e0bb8_1.0.0.0_x86__c6sq6kwgxxfcg "\"C:\VSJITLauncher.exe\" Game"
ここで、Game
はプロセス名、279f7062-ce35-40e8-a69f-cc22c08e0bb8_1.0.0.0_x86__c6sq6kwgxxfcg
はサンプル UWP アプリ パッケージの完全なパッケージ名です。
/enableDebug に対するすべての呼び出しは、後で /disableDebug スイッチを使用して別の PLMDebug 呼び出しに結合する必要があることに注意してください。 さらに、デバッガーへのパスは絶対パスである必要があります (相対パスはサポートされていません)。