共用方式為


進程生命週期管理的測試和除錯工具(PLM)

UWP 應用程式和傳統型桌面應用程式之間的其中一個主要差異在於 UWP 應用程式位於受程序生命週期管理 (PLM) 約束的應用程式容器中。 UWP 應用程式可以由 Runtime Broker 服務在所有平台上暫停、恢復或終止,並且在您測試或偵錯處理應用狀態變更的程式碼時,提供專用工具以強制這些狀態轉換。

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 可防止 Runtime Broker 服務在您有機會進行偵錯之前終止您的應用程式。 若要停用 PLM,請使用 /enableDebug 參數,後面接著您的 UWP 應用程式 完整套件名稱(套件的簡短名稱、套件系列名稱或 AUMID 將無法運作):

plmdebug /enableDebug [PackageFullName]

從 Visual Studio 部署 UWP 應用程式之後,完整套件名稱會顯示在輸出視窗中。 或者,您也可以在 PowerShell 控制台中執行 Get-AppxPackage 來擷取完整的套件名稱。

執行 Get-AppxPackage

您可以選擇性地指定調試程式的絕對路徑,以在啟動應用程式套件時自動啟動。 如果您想要使用 Visual Studio 執行這項作,您必須將 VSJITDebugger.exe 指定為調試程式。 不過,VSJITDebugger.exe 要求您指定「-p」切換,以及 UWP 應用程式的進程 ID (PID)。 因為無法事先知道您的 UWP 應用程式的 PID,因此無法直接使用這種情境。

您可以撰寫會識別您的遊戲程式的腳本或工具,接著透過 Shell 執行 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 之後,都必須與另一個 PLMDebug 呼叫搭配 /disableDebug 參數。 此外,調試程式的路徑必須是絕對路徑(不支持相對路徑)。