2013-01-09 11 views
6

Windows Phone 7 Emulator aveva una bella caratteristica finestra di console che può essere abilitato tramite impostazione del Registro (EnableConsole) oppure tramite il parametro decfg di XDE.exeFinestra Console Feature In Windows Phone 8 emulatore

Ha funzionato anche senza associare debugger. È stato utile per trovare problemi di associazione al runtime, eccezioni.

C'è un modo per abilitare la finestra della console nell'emulatore di Windos 8 Phone?

risposta

1

Ho cercato una console o qualsiasi altro modo per monitorare l'esecuzione delle app sull'emulatore WP8 senza collegare il debugger per un po 'di tempo. Sembra che, essendo in esecuzione su VM iper-v, la console non sia più disponibile.

Tuttavia ho trovato un po 'di soluzione. È possibile creare una classe semplice per registrare i messaggi nell'archiviazione isolata dell'app (ulteriori informazioni sull'archiviazione isolata here). Dopo aver eseguito la tua app, puoi esaminare il contenuto della memoria isolata usando un Windows Phone Power Tools (fortunatamente ha un'opzione di "aggiornamento" in modo da poter eseguire alcune azioni sull'emulatore e quindi semplicemente rivedere la memoria isolata).

12

L'emulatore WP8 è una completa riscrittura dell'emulatore WP7, quindi è improbabile che supporti gli stessi messaggi di debug non documentati. Alla fine della giornata la domanda è: cosa stai cercando di registrare?

  • Si sta tentando di arrivare a informaiton specifico per la vostra applicazione? Quindi utilizzare l'idea di Pavel sulla condivisione di file IsoStore tramite lo CoreCon API per WP8.
  • Stai cercando di ottenere i messaggi per eventi interessanti nell'emulatore sé? L'emulatore accede a un provider ETW e puoi leggere da quel registro. Mostrerò qui come.
  • Stai cercando di ottenere informazioni dall'interno del sistema operativo WP8? Quindi generare un file ETL ed esaminarlo o utilizzare direttamente le API di profilazione.

registrazione app messaggi specifici

Diciamo qualcosa di interessante accade nella vostra app come un pulsante di scatto importante. Dovrai registrarlo nella tua app e scrivere quel messaggio su IsoStore (o inviarlo a un servizio web personalizzato). Uso MetroLog per la registrazione WP8 & Win8 ma è possibile utilizzare tutto ciò che si desidera purché i file vengano scritti su IsoStore. Controlla MetroLog @https://github.com/mbrit/MetroLog

È quindi possibile utilizzare il CoreCon API per leggere il file. Ho caricato un esempio di codice di queste API ofr WP8 @ messaggi specifici https://stackoverflow.com/a/13429709/81687


registrazione Emulator

dici che siete interessati a vedere quando l'emulatore è stato attivato, quando lo zoom è stato impostato, se uno screenshot non è riuscito o se si è verificato un evento di tocco. L'emulatore WP8 utilizza il provider ETW ff86852d-541c-4f7e-98c5-5761e8cb7074 per registrare tali eventi.Ulteriori informazioni su ETW sono disponibili qui: http://msdn.microsoft.com/en-us/magazine/cc163437.aspx

Per prima cosa, scaricare PerfView per avviare l'emulatore XDE.exe e iniziare a catturare l'output ETW.

PerfView start with all the aforementioned options

  • Impostare la directory di lavoro alla posizione del XDE.exe per WP8.
  • Assicurarsi di eseguire prima l'emulatore da VS2012 per creare l'immagine Hyper-V. Oppure, se sai come puoi fare a mano l'immagine e utilizzare il parametro/VHD.
  • Quando si richiama XDE.exe, è possibile ottenere il parametro/NAME dal gestore Hyper-V.
  • Assicurarsi di impostare il provider aggiuntivo per includere "ff86852d-541c-4f7e-98c5-5761e8cb7074".

Ora eseguire l'emulatore da PerfView, eseguire alcune operazioni, arrestare l'emulatore e interrompere la raccolta di informazioni. Una volta fatto, puoi vedere un registro di tutto ciò che è accaduto nell'emulatore. Le cose interessanti sono sotto il registro "Eventi" una volta che le hai filtrate sotto l'ID del provider.

PerfView events data

Nella schermata di stampa sopra puoi vedere le partite e, quando sono avvenute nell'emulatore. Ad esempio, l'evento 76 è MicrophoneCaptureThreadStarted per l'emulatore ed è successo 27 secondi nella sessione di profilazione. Per l'elenco completo dei codici evento, vedere Microsoft.Xde.Etw.WindowsPhoneEmulatorProvider c'tor nell'assembly XDE.exe. E 'la copia incollato qui per i tuoi convincere:

public WindowsPhoneEmulatorProvider() 
{ 
    this.m_provider = new EventProviderVersionTwo(new Guid("ff86852d-541c-4f7e-98c5-5761e8cb7074")); 
    this.XdeStarted = new EventDescriptor(0, 0, 9, 4, 0, 0, -9223372036854775808L); 
    this.XdeStopped = new EventDescriptor(1, 0, 0, 4, 0, 0, 0L); 
    this.DesktopResolutionChanged = new EventDescriptor(2, 0, 0, 4, 0, 0, 0L); 
    this.InvalidLanguageSpecified = new EventDescriptor(3, 0, 0, 2, 0, 0, 0L); 
    this.CantFindVhd = new EventDescriptor(5, 0, 0, 2, 0, 0, 0L); 
    this.DiffDiskVhdRequiresVhdPath = new EventDescriptor(6, 0, 0, 2, 0, 0, 0L); 
    this.InvalidVideoParam = new EventDescriptor(7, 0, 0, 2, 0, 0, 0L); 
    this.InvalidMemorySize = new EventDescriptor(8, 0, 0, 2, 0, 0, 0L); 
    this.CantFindVM = new EventDescriptor(9, 0, 0, 2, 0, 0, 0L); 
    this.UnableToSendKeyToVM = new EventDescriptor(10, 0, 0, 2, 0, 0, 0L); 
    this.FailedToCreateDiffVhd = new EventDescriptor(11, 0, 0, 2, 0, 0, 0L); 
    this.FailedToCreateVM = new EventDescriptor(12, 0, 0, 2, 0, 0, 0L); 
    this.FailedVMStop = new EventDescriptor(13, 0, 0, 2, 0, 0, 0L); 
    this.FailedStartVM = new EventDescriptor(14, 0, 0, 2, 0, 0, 0L); 
    this.UnableToConnectToGuest = new EventDescriptor(15, 0, 0, 2, 0, 0, 0L); 
    this.ConnectedToGuest = new EventDescriptor(0x10, 0, 0, 4, 0, 0, 0L); 
    this.GuestIndicatedResolution = new EventDescriptor(0x11, 0, 0, 4, 0, 0, 0L); 
    this.LoadedSkin = new EventDescriptor(0x12, 0, 0, 4, 0, 0, 0L); 
    this.ButtonPressed = new EventDescriptor(0x13, 0, 0, 4, 0, 0, 0L); 
    this.VirtualMachineStateChanged = new EventDescriptor(20, 0, 0, 4, 0, 0, 0L); 
    this.ProxyInitialized = new EventDescriptor(4, 0, 0, 4, 0, 0, 0L); 
    this.UsageShown = new EventDescriptor(0x16, 0, 0, 4, 0, 0, 0L); 
    this.DisplayOrientationSet = new EventDescriptor(0x17, 0, 0, 4, 0, 0, 0L); 
    this.ZoomSet = new EventDescriptor(0x18, 0, 0, 4, 0, 0, 0L); 
    this.ScreenshotSavedToFile = new EventDescriptor(0x19, 0, 0, 4, 0, 0, 0L); 
    this.KeySentToVM = new EventDescriptor(0x1a, 0, 0, 4, 0, 0, 0L); 
    this.MouseEventSentToVM = new EventDescriptor(0x1b, 0, 0, 4, 0, 0, 0L); 
    this.UnableToSendMouseEventToVM = new EventDescriptor(0x1c, 0, 0, 0, 0, 0, 0L); 
    this.BringToFrontExecuted = new EventDescriptor(0x1d, 0, 0, 4, 0, 0, 0L); 
    this.ConnectedToAccelerometer = new EventDescriptor(30, 0, 0, 4, 0, 0, 0L); 
    this.UnableToConnectToAccelermometer = new EventDescriptor(0x1f, 0, 0, 0, 0, 0, 0L); 
    this.InvalidWindowsDetected = new EventDescriptor(0x20, 0, 0, 2, 0, 0, 0L); 
    this.HyperVNotEnabled = new EventDescriptor(0x21, 0, 0, 2, 0, 0, 0L); 
    this.AskedToConnectExternalSwitches = new EventDescriptor(0x22, 0, 0, 4, 0, 0, 0L); 
    this.ConnectedToGuestNotifications = new EventDescriptor(0x23, 0, 0, 4, 0, 0, 0L); 
    this.UnableToConnectToGuestNotifications = new EventDescriptor(0x24, 0, 0, 2, 0, 0, 0L); 
    this.FailedToSetVmProperties = new EventDescriptor(0x25, 0, 0, 2, 0, 0, 0L); 
    this.FailedToInitializeSnapshots = new EventDescriptor(0x26, 0, 0, 2, 0, 0, 0L); 
    this.FailedToSetVhd = new EventDescriptor(0x27, 0, 0, 2, 0, 0, 0L); 
    this.RdpServerDisconnected = new EventDescriptor(40, 0, 0, 4, 0, 0, 0L); 
    this.ScreenshotFailed = new EventDescriptor(0x29, 0, 0, 2, 0, 0, 0L); 
    this.AccelerometerSendFailed = new EventDescriptor(0x2a, 0, 0, 2, 0, 0, 0L); 
    this.LocationSendFailed = new EventDescriptor(0x2b, 0, 0, 2, 0, 0, 0L); 
    this.SnapshotStarted = new EventDescriptor(0x2c, 0, 0, 0, 0, 0, 0L); 
    this.SnapshotSucceeded = new EventDescriptor(0x2d, 0, 0, 0, 0, 0, 0L); 
    this.SnapshotFailed = new EventDescriptor(0x2e, 0, 0, 2, 0, 0, 0L); 
    this.CloseAfterSilentSnapshot = new EventDescriptor(0x2f, 0, 0, 0, 0, 0, 0L); 
    this.ApplySnapshotFailed = new EventDescriptor(0x30, 0, 0, 2, 0, 0, 0L); 
    this.RemovingSnapshotAfterFailedConnect = new EventDescriptor(50, 0, 0, 0, 0, 0, 0L); 
    this.RemovingSnapshotAfterSettingsDidntMatch = new EventDescriptor(0x33, 0, 0, 0, 0, 0, 0L); 
    this.ConnectedToShellReadyPipe = new EventDescriptor(0x34, 0, 0, 4, 0, 0, 0L); 
    this.UnableToConnectToShellReadyPipe = new EventDescriptor(0x35, 0, 0, 2, 0, 0, 0L); 
    this.ConnectedToTouch = new EventDescriptor(0x36, 0, 0, 4, 0, 0, 0L); 
    this.UnableToConnectToTouch = new EventDescriptor(0x37, 0, 0, 2, 0, 0, 0L); 
    this.TouchSendFailed = new EventDescriptor(0x38, 0, 0, 2, 0, 0, 0L); 
    this.SendTextFailed = new EventDescriptor(0x39, 0, 0, 2, 0, 0, 0L); 
    this.ReceiveAudioFromGuestWithSpinFailed = new EventDescriptor(0x3a, 0, 0, 2, 0, 0, 0L); 
    this.SendMicrophoneDataToGuestFailed = new EventDescriptor(0x3b, 0, 0, 2, 0, 0, 0L); 
    this.LoadUserSettingsFailed = new EventDescriptor(60, 0, 0, 0, 0, 0, 0L); 
    this.SetGuestSystemTimeAndZoneFailed = new EventDescriptor(0x3d, 0, 0, 2, 0, 0, 0L); 
    this.HypervisorNotRunning = new EventDescriptor(0x3e, 0, 0, 2, 0, 0, 0L); 
    this.HyperVManagementServiceNotRunning = new EventDescriptor(0x3f, 0, 0, 2, 0, 0, 0L); 
    this.UserAlreadyInHyperVAdmin = new EventDescriptor(0x40, 0, 0, 4, 0, 0, 0L); 
    this.UserAddedToHyperVAdmins = new EventDescriptor(0x41, 0, 0, 4, 0, 0, 0L); 
    this.FailedToAddUserToHyperVAdmins = new EventDescriptor(0x42, 0, 0, 0, 0, 0, 0L); 
    this.SendKeyboardEvent = new EventDescriptor(0x43, 0, 0, 4, 0, 0, 0L); 
    this.SendKeyboardEventFailed = new EventDescriptor(0x44, 0, 0, 2, 0, 0, 0L); 
    this.AudioPlayThreadStarted = new EventDescriptor(0x45, 0, 0, 0, 0, 0, 0L); 
    this.AudioPlayThreadExited = new EventDescriptor(70, 0, 0, 0, 0, 0, 0L); 
    this.AudioDataReceivedFromGuest = new EventDescriptor(0x47, 0, 0, 0, 0, 0, 0L); 
    this.AudioGlitch = new EventDescriptor(0x48, 0, 0, 0, 0, 0, 0L); 
    this.AudioPaused = new EventDescriptor(0x49, 0, 0, 0, 0, 0, 0L); 
    this.AudioResumed = new EventDescriptor(0x4a, 0, 0, 0, 0, 0, 0L); 
    this.AudioDeviceChange = new EventDescriptor(0x4b, 0, 0, 0, 0, 0, 0L); 
    this.MicrophoneCaptureThreadStarted = new EventDescriptor(0x4c, 0, 0, 0, 0, 0, 0L); 
    this.MicrophoneCaptureThreadExited = new EventDescriptor(0x4d, 0, 0, 0, 0, 0, 0L); 
    this.MicrophoneDataSentToGuest = new EventDescriptor(0x4e, 0, 0, 0, 0, 0, 0L); 
    this.MicrophoneDeviceChange = new EventDescriptor(0x4f, 0, 0, 0, 0, 0, 0L); 
    this.GetNetworkInfoFailed = new EventDescriptor(90, 0, 0, 2, 0, 0, 0L); 
    this.IPRenewalInitiated = new EventDescriptor(0x5b, 0, 0, 4, 0, 0, 0L); 
} 

Registrazione degli eventi dal Hyper-V ospitato OS

Diciamo che si vuole sapere di più su come WP8 JIT assemblee o quando lo fa spazzatura collezione. VS2012 viene fornito con strumenti di analisi che consentono di profilare, archiviare e visualizzare tali informazioni. Ad esempio, ecco come avviare una sessione di profilatura:

Starting a WP8 analysis session

Una volta che la sessione di profilatura è fatto è possibile visualizzare la cartella "PerfLogs" sotto la tua applicazione ha i dati per la sessione di profilatura. Se hai profilato CPU/Esecuzione, puoi vedere i file VSPX in quella cartella. Rinominare il file VSPX in ZIP ed estrarre i file che contiene. In questo ZIP troverai un file ETL. Quel file ETL è ancora un altro log ETW, possiamo esaminare PerfView.

ETL and VSPX files

Quando apriamo un tale file ETL in PerfView possiamo vedere quando ogni classe era JITTed, il tempo impiegato e le IL & formati nativi. Per esempio di classe App della nostra applicazione è stata JITTed a 123.461ms, per 1.2ms con una dimensione di IL 105 e la dimensione nativa di 289.

PerfView Jitting data

Si potrebbe anche essere in grado di utilizzare direttamente le API di profiling invece di utilizzare VS2012 per acquisire tali dati. Se è qualcosa che ti piacerebbe fare, dovrai decodificare gli insiemi SilverlightProfiler. *. Dll di VS2012 per vedere cosa stanno facendo e ricrearlo al di fuori di VS2012.

+0

Grazie.Proverò e ti farò sapere – Lokeshwer

+0

Ottimo lavoro ... :) – StezPet

Problemi correlati