Alat pengujian dan penelusuran kesalahan untuk Process Lifetime Management (PLM)

Salah satu perbedaan utama antara aplikasi UWP dan aplikasi desktop tradisional adalah judul UWP berada dalam kontainer aplikasi yang tunduk pada Process Lifecycle Management (PLM). Aplikasi UWP dapat ditangguhkan, dilanjutkan, atau dihentikan di semua platform oleh layanan Runtime Broker, dan ada alat khusus yang dapat Anda gunakan untuk memaksa transisi tersebut saat Anda menguji atau men-debug kode yang menanganinya.

Fitur di Visual Studio 2015

Debugger bawaan di Visual Studio 2015 dapat membantu Anda menyelidiki potensi masalah saat menggunakan fitur eksklusif UWP. Anda dapat memaksa aplikasi Anda ke status PLM yang berbeda dengan menggunakan toolbar Peristiwa Siklus Hidup, yang menjadi terlihat saat Anda menjalankan dan men-debug judul Anda.

Lifecycle Events Toolbar

Alat PLMDebug

PLMDebug.exe adalah alat baris perintah yang memungkinkan Anda mengontrol status PLM paket aplikasi, dan dikirim sebagai bagian dari Windows SDK. Setelah diinstal, alat berada di C:\Program Files (x86)\Windows Kits\10\Debuggers\x64 secara default.

PLMDebug juga memungkinkan Anda menonaktifkan PLM untuk paket aplikasi yang diinstal, yang diperlukan untuk beberapa debugger. Menonaktifkan PLM mencegah layanan Runtime Broker menghentikan aplikasi Anda sebelum Anda memiliki kesempatan untuk melakukan debug. Untuk menonaktifkan PLM, gunakan sakelar /enableDebug , diikuti dengan nama paket lengkap aplikasi UWP Anda (nama pendek, nama keluarga paket, atau AUMID paket tidak akan berfungsi):

plmdebug /enableDebug [PackageFullName]

Setelah menyebarkan aplikasi UWP Anda dari Visual Studio, nama paket lengkap ditampilkan di jendela output. Atau, Anda juga dapat mengambil nama paket lengkap dengan menjalankan Get-AppxPackage di konsol PowerShell.

Running Get-AppxPackage

Secara opsional, Anda dapat menentukan jalur absolut ke debugger yang akan diluncurkan secara otomatis saat paket aplikasi Anda diaktifkan. Jika Anda ingin melakukan ini menggunakan Visual Studio, Anda harus menentukan VSJITDebugger.exe sebagai debugger. Namun, VSJITDebugger.exe mengharuskan Anda menentukan sakelar "-p", bersama dengan ID proses (PID) aplikasi UWP. Karena tidak mungkin untuk mengetahui PID aplikasi UWP Anda sebelumnya, skenario ini tidak dimungkinkan di luar kotak.

Anda dapat mengatasi batasan ini dengan menulis skrip atau alat yang mengidentifikasi proses game Anda, dan kemudian shell menjalankan VSJITDebugger.exe, melewati PID aplikasi UWP Anda. Sampel kode C# berikut mengilustrasikan pendekatan langsung untuk mencapai hal ini.

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();
        }
    }
}

Contoh penggunaan ini bersama dengan PLMDebug:

plmdebug /enableDebug 279f7062-ce35-40e8-a69f-cc22c08e0bb8_1.0.0.0_x86__c6sq6kwgxxfcg "\"C:\VSJITLauncher.exe\" Game"

di mana Game adalah nama proses, dan 279f7062-ce35-40e8-a69f-cc22c08e0bb8_1.0.0.0_x86__c6sq6kwgxxfcg merupakan nama paket lengkap dari contoh paket aplikasi UWP.

Perhatikan bahwa setiap panggilan ke /enableDebug harus digabungkan nanti ke panggilan PLMDebug lain dengan sakelar /disableDebug . Selain itu, jalur ke debugger harus absolut (jalur relatif tidak didukung).