Strumenti di test e debug per Gestione del ciclo di vita dei processi

Una delle principali differenze tra le app UWP e le applicazioni desktop tradizionali è che i titoli UWP si trovano in un contenitore di app soggetto a Gestione del ciclo di vita dei processi. Le app UWP possono essere sospese, riprese o terminate in tutte le piattaforme dal servizio Runtime Broker e ci sono strumenti dedicati che puoi usare per forzare quelle transizioni quando esegui un test o il debug del codice che le gestisce.

Funzionalità in Visual Studio 2015

Il debugger predefinito in Visual Studio 2015 può aiutarti ad analizzare i potenziali problemi quando usi funzionalità esclusive della piattaforma UWP. Puoi imporre alla tua applicazione stati diversi di Gestione del ciclo di vita dei processi usando la barra degli strumenti Eventi ciclo di vita, che diventa visibile quando esegui il titolo e ne effettui il debug.

Lifecycle Events Toolbar

Strumento PLMDebug

PLMDebug.exe è uno strumento della riga di comando che ti consente di controllare lo stato di Gestione del ciclo di vita dei processi di un pacchetto dell'applicazione e che fa parte di Windows SDK. Una volta installato, lo strumento si trova in C:\Programmi (x86)\Windows Kits\10\Debuggers\x64 per impostazione predefinita.

PLMDebug ti consente anche di disabilitare Gestione del ciclo di vita dei processi per qualsiasi pacchetto dell'app installato, come richiedono alcuni debugger. La disabilitazione di Gestione del ciclo di vita dei processi impedisce al servizio Runtime Broker di terminare la tua app prima di poterne eseguire il debug. Per disabilitare Gestione del ciclo di vita dei processi, usa l'opzione /enableDebug, seguita dal nome completo del pacchetto della tua app UWP (il nome breve, il nome della famiglia di pacchetti o l'AUMID di un pacchetto non funzioneranno):

plmdebug /enableDebug [PackageFullName]

Dopo la distribuzione della tua app UWP da Visual Studio, il nome completo del pacchetto viene visualizzato nella finestra di output. In alternativa, puoi anche recuperare il nome completo del pacchetto eseguendo Get-AppxPackage in una console di PowerShell.

Running Get-AppxPackage

Se vuoi, puoi anche specificare un percorso assoluto a un debugger che si avvierà automaticamente quando il tuo pacchetto dell'app verrà attivato. Se preferisci farlo con Visual Studio, dovrai specificare VSJITDebugger.exe come debugger. Con VSJITDebugger.exe devi però specificare l'opzione "-p", con l'ID processo (PID) dell'app UWP. Dato che non è possibile conoscere il PID della tua app UWP in anticipo, questo scenario non può essere messo in pratica immediatamente.

Puoi aggirare questa limitazione scrivendo uno script o uno strumento per identificare il processo del gioco e poi la shell eseguirà VSJITDebugger.exe, passandolo nel PID dell'app UWP. L'esempio di codice C# seguente illustra un approccio mirato per questa situazione.

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

Utilizzo di esempio con PLMDebug:

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

dove Game è il nome del processo e 279f7062-ce35-40e8-a69f-cc22c08e0bb8_1.0.0.0_x86__c6sq6kwgxxfcg è il nome completo del pacchetto dell'app UWP di esempio.

Nota che ogni chiamata a /enableDebug deve poi essere abbinata a un'altra chiamata a PLMDebug con l'opzione /disableDebug. Il percorso di un debugger deve anche essere assoluto. I percorsi relativi non sono supportati.