プロセス ライフタイム管理 (PLM) のテスト ツールとデバッグ ツール

UWP アプリと従来のデスクトップ アプリケーションの主な違いの 1 つは、UWP タイトルが、プロセス ライフサイクル管理 (PLM) の対象となるアプリ コンテナーに存在することです。 UWP アプリは、ランタイム ブローカー サービスによってすべてのプラットフォームにわたり一時停止、再開、終了できます。また、それらを処理するコードをテストまたはデバッグするときにそれらの遷移を強制するために使用する、専用のツールがあります。

Visual Studio 2015 の機能

Visual Studio 2015 の組み込みデバッガーは、UWP 専用機能を使用しているときに潜在的な問題を調査するために役立ちます。 タイトルを実行しデバッグするときに表示される、[ライフサイクル イベント] ツール バーを使用すると、アプリケーションを強制的にさまざまな PLM 状態にできます。

Lifecycle Events Toolbar

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 を実行して完全なパッケージ名を取得することもできます。

Running Get-AppxPackage

必要に応じて、アプリ パッケージのアクティブ化時に自動的に起動されるデバッガーへの絶対パスを指定できます。 Visual Studio を使用してこれを行う場合は、デバッガーとして VSJITDebugger.exe を指定する必要があります。 ただし、VSJITDebugger.exe では、UWP アプリのプロセス ID (PID) とともに "-p" スイッチを指定する必要があります。 事前に UWP アプリの PID を把握することはできないため、このシナリオはそのままでは使用できません。

この制限を回避するには、ゲームのプロセスを特定するスクリプトまたはツールを記述します。その後、シェルで、UWP アプリの PID を渡して VSJITDebugger.exe を実行します。 次の 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 呼び出しと対にする必要があります。 また、デバッガーへのパスは絶対パスである必要があります (相対パスはサポートされていません)。