2013-01-09 15 views
6

Windows Phone 7 Emulator miał ładny okno konsoli funkcji, które mogą być włączone przez ustawienie rejestru (EnableConsole) lub za pośrednictwem parametru decfg z XDE.exeConsole Cecha Okno na Windows Phone 8 Emulator

Udało się nawet bez mocowania debugger. Było to pomocne w znalezieniu problemów wiążących się ze zdarzeniami w czasie wykonywania, wyjątków.

Czy istnieje sposób włączenia okna konsoli w emulatorze telefonu Windos 8?

Odpowiedz

1

Szukałem konsoli lub innego sposobu śledzenia działania aplikacji na emulatorze WP8 bez dołączania debuggera przez jakiś czas. Wygląda na to, że działa ona na maszynie wirtualnej hyper-v, konsola nie jest już dostępna.

Jednak znalazłem małe obejście. Możesz utworzyć prostą klasę, która będzie rejestrować twoje wiadomości w odizolowanym magazynie aplikacji (więcej informacji na temat pojedynczego magazynu here). Po uruchomieniu aplikacji możesz sprawdzić zawartość pojedynczego magazynu za pomocą Windows Phone Power Tools (na szczęście ma opcję "odświeżania", dzięki czemu możesz wykonać pewne czynności na emulatorze, a następnie dokonać korekty pojedynczego miejsca).

12

Emulator WP8 to kompletne przepisanie emulatora WP7, więc jest mało prawdopodobne, że obsługuje on te same nieudokumentowane komunikaty debugowania. Pod koniec dnia pojawia się pytanie: co próbujesz zalogować?

  • Czy starasz się dostać na informaiton specyficznego dla aplikacji? Następnie skorzystaj z pomysłu Pavela na udostępnianie plików IsoStore poprzez CoreCon API dla WP8.
  • Czy próbujesz uzyskać wiadomości o interesujących wydarzeniach w samym emulatorze? Emulator rejestruje się do dostawcy ETW i można go odczytać z tego dziennika. Pokażę ci jak.
  • Czy próbujesz uzyskać informacje z wnętrza WP8 OS? Następnie wygeneruj plik ETL i sprawdź go lub skorzystaj bezpośrednio z interfejsów API profilowania.

aplikacja Logging konkretne komunikaty

Powiedzmy coś ciekawego dzieje się w Twojej aplikacji jak ważny kliknięcia przycisku. Będziesz chciał zalogować to w swojej aplikacji i napisać tę wiadomość do IsoStore (lub wysłać do niestandardowej usługi internetowej). Używam MetroLog do mojego rejestrowania Win8 WP8 &, ale możesz używać wszystkiego, co chcesz, dopóki pliki są zapisywane do IsoStore. Sprawdź MetroLog @https://github.com/mbrit/MetroLog

Możesz następnie użyć CoreCon API, aby przeczytać plik. I przesłaniu próbki kodu z tych interfejsów API OFR WP8 @https://stackoverflow.com/a/13429709/81687


Logging emulatora określonych komunikatów

że jesteś ciekaw kiedy emulator została aktywowana, gdy zoom został ustawiony, jeśli zrzut ekranu się nie powiódł lub nastąpiło zdarzenie dotykowe. Emulator WP8 używa dostawcy ETW ff86852d-541c-4f7e-98c5-5761e8cb7074 do rejestrowania tych innych zdarzeń.Możesz przeczytać więcej o ETW tutaj @http://msdn.microsoft.com/en-us/magazine/cc163437.aspx

Najpierw pobierz PerfView, aby uruchomić emulator XDE.exe i zacznij przechwytywać dane wyjściowe ETW.

PerfView start with all the aforementioned options

  • Ustaw katalog roboczy do lokalizacji XDE.exe dla WP8.
  • Najpierw uruchom ten emulator z VS2012, aby utworzyć obraz Hyper-V. Lub jeśli wiesz, jak możesz samemu wykręcić obraz i użyć parametru/VHD.
  • Podczas wywoływania XDE.exe można uzyskać parametr/NAME z menedżera funkcji Hyper-V.
  • Należy ustawić dodatkowego dostawcę tak, aby zawierał "ff86852d-541c-4f7e-98c5-5761e8cb7074".

Teraz uruchom emulator z PerfView, zrób coś, zamknij emulator i przestań zbierać informacje. Gdy to zrobisz, zobaczysz dziennik wszystkiego, co działo się w emulatorze. Interesujące rzeczy znajdują się w dzienniku "Zdarzenia" po przefiltrowaniu go pod identyfikatorem dostawcy.

PerfView events data

W powyższym ekranie drukowania można zobaczyć wydarzenia, a kiedy się w emulatorze. Na przykład zdarzenie 76 jest MicrophoneCaptureThreadStarted dla emulatora i stało się 27 sekund w sesji profilowania. Aby uzyskać pełną listę kodów zdarzeń, zobacz Microsoft.Xde.Etw.WindowsPhoneEmulatorProvider c'tor w zestawie XDE.exe. To kopia wklejony tutaj swoimi przekonać:

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

rejestrowania zdarzeń z Hyper-V gospodarzem OS

Powiedzmy chcesz wiedzieć więcej o tym, jak WP8 śledcze zespołów lub gdy to robi śmieci kolekcja. VS2012 jest dostarczany z narzędziami do analizy, które profilują, przechowują i wyświetlają te informacje. Na przykład, oto jak rozpocząć sesję profilowania:

Starting a WP8 analysis session

Po sesji profilowania odbywa widać „PerfLogs” Folder ramach aplikacji zawiera dane dotyczące sesji profilowania. Jeśli wyprofilowałeś procesor/wykonanie, możesz zobaczyć pliki VSPX w tym folderze. Zmień nazwę pliku VSPX na ZIP i wyodrębnij zawarte w nim pliki. W tym ZIP znajdziesz plik ETL. Ten plik ETL jest kolejnym logiem ETW, który możemy zbadać PerfView.

ETL and VSPX files

Kiedy otwarcie takiego pliku ETL w PerfView widzimy, gdy każda klasa była JITTed, jak długo to trwało i IL & Native rozmiary. Na przykład naszą aplikację za klasa App został JITTed na 123.461ms dla 1.2ms o rozmiarze IL 105 i natywnej wielkości 289.

PerfView Jitting data

Można również mieć możliwość bezpośredniego korzystania z API profilowania zamiast korzystania VS2012, aby przechwycić te dane. Jeśli jest to coś, co chciałbyś zrobić, będziesz musiał dokonać inżynierii wstecznej VS2012 SilverlightProfiler. *. Dll złożeń, aby zobaczyć, co robią i odtworzyć go poza VS2012.

+0

Dzięki.Wypróbuję i dam znać – Lokeshwer

+0

Świetna robota ... :) – StezPet