プロセス ライフタイム管理 (PLM) のテスト ツールとデバッグ ツールTesting and debugging tools for Process Lifetime Management (PLM)

UWP アプリと従来のデスクトップ アプリケーションの主な違いの 1 つは、UWP のタイトルがプロセス ライフサイクル管理 (PLM) の対象となるアプリ コンテナーに配置されることです。One of the key differences between UWP apps and traditional desktop applications is that UWP titles reside in an app container subject to Process Lifecycle Management (PLM). ランタイム ブローカー サービスによって、UWP アプリはすべてのプラットフォームで中断、再開、または終了することができ、このような状態遷移を処理するコードをテストまたはデバッグするときに状態遷移を強制する目的で使う専用ツールがあります。UWP apps can be suspended, resumed, or terminated across all platforms by the Runtime Broker service, and there are dedicated tools for you to use to force those transitions when you are testing or debugging the code that handles them.

Visual Studio 2015 の機能Features in Visual Studio 2015

Visual Studio 2015 の組み込みのデバッガーを使うと、UWP 専用の機能を使うときの潜在的な問題を調査することができます。The built-in debugger in Visual Studio 2015 can help you investigate potential issues when using UWP-exclusive features. タイトルを実行してデバッグするときに表示される [ライフサイクル イベント] ツール バーを使うと、アプリケーションをさまざまな PLM の状態へと強制できます。You can force your application into different PLM states by using the Lifecycle Events toolbar, which becomes visible when you run and debug your title.

[ライフサイクル イベント] ツールバー

PLMDebug ツールThe PLMDebug tool

PLMDebug.exe は、アプリケーション パッケージの PLM の状態を制御できるようにするコマンド ライン ツールであり、Windows SDK の一部としてリリースされています。PLMDebug.exe is a command-line tool that allows you to control the PLM state of an application package, and is shipped as part of the Windows SDK. インストール後、ツールは既定で C:\Program Files (x86)\Windows Kits\10\Debuggers\x64 に配置されます。After it is installed, the tool resides in C:\Program Files (x86)\Windows Kits\10\Debuggers\x64 by default.

PLMDebug を使うと、一部のデバッガーで必要とされるインストール済みアプリ パッケージの PLM を無効にすることもできます。PLMDebug also allows you to disable PLM for any installed app package, which is necessary for some debuggers. PLM を無効にすると、ランタイム ブローカー サービスでは、デバッグ前にアプリを終了できなくなります。Disabling PLM prevents the Runtime Broker service from terminating your app before you have a chance to debug. PLM を無効にするには、UWP アプリの完全なパッケージ名 (短い名前、パッケージ ファミリ名、またはパッケージの AUMID は機能しません) が後に続く、 /enableDebug スイッチを使います。To disable PLM, use the /enableDebug switch, followed by the full package name of your UWP app (the short name, package family name, or AUMID of a package will not work):

plmdebug /enableDebug [PackageFullName]

Visual Studio の UWP アプリを展開すると、出力ウィンドウに完全なパッケージ名が表示されます。After deploying your UWP app from Visual Studio, the full package name is displayed in the output window. または、PowerShell コンソールで Get-AppxPackage を実行することによって、完全なパッケージ名を取得することもできます。Alternatively, you can also retrieve the full package name by running Get-AppxPackage in a PowerShell console.

Get-AppxPackage の実行

必要に応じて、アプリ パッケージがアクティブになると自動的に起動されるデバッガーの絶対パスを指定できます。Optionally, you can specify an absolute path to a debugger that will automatically launch when your app package is activated. Visual Studio を使って指定する場合は、デバッガーとして VSJITDebugger.exe を指定する必要があります。If you wish to do this using Visual Studio, you’ll need to specify VSJITDebugger.exe as the debugger. ただし、VSJITDebugger.exe では、UWP アプリのプロセス ID (PID) と共に "-p" スイッチを指定する必要があります。However, VSJITDebugger.exe requires that you specify the “-p” switch, along with the process ID (PID) of the UWP app. 事前に UWP アプリの PID を把握することはできないため、このシナリオはそのままでは使用できません。Because it’s not possible to know the PID of your UWP app beforehand, this scenario is not possible out of the box.

この制限は、ゲームのプロセスを特定するスクリプトまたはツールを記述することによって回避でき、シェルは、UWP アプリの PID を渡した VSJITDebugger.exe を実行します。You can work around this limitation by writing a script or tool that identifies your game’s process, and then the shell runs VSJITDebugger.exe, passing in the PID of your UWP app. 次の C# コード サンプルは、これを実行するための簡単なアプローチを示しています。The following C# code sample illustrates a straightforward approach to accomplish this.

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 と組み合わせた使用例を次に示します。Example usage of this in conjunction with 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 アプリ パッケージ例の完全なパッケージ名です。where Game is the process name, and 279f7062-ce35-40e8-a69f-cc22c08e0bb8_1.0.0.0_x86__c6sq6kwgxxfcg is the full package name of the example UWP app package.

/enableDebug のすべての呼び出しは、後ほど /disableDebug スイッチを使って別の PLMDebug の呼び出しに結合する必要があります。Note that every call to /enableDebug must be later coupled to another PLMDebug call with the /disableDebug switch. さらに、デバッガーのパスは絶対パスにする必要があります (相対パスはサポートされていません)。Furthermore, the path to a debugger must be absolute (relative paths are not supported).