2013-01-09 10 views
6

विंडोज फोन 7 एम्यूलेटर एक अच्छा कंसोल विंडो सुविधा है जो रजिस्ट्री सेटिंग (EnableConsole) के माध्यम से या XDE.exeकंसोल विंडो सुविधा Windows Phone 8 एम्युलेटर पर

की decfg पैरामीटर के माध्यम से यह डिबगर संलग्न के बिना भी काम किया सक्रिय किया जा सकता था। रनटाइम बाध्यकारी मुद्दों, अपवादों को ढूंढने में यह सहायक था।

क्या विंडोस 8 फोन एमुलेटर में कंसोल विंडो को सक्षम करने का कोई तरीका है?

उत्तर

1

मैं कुछ समय के लिए डीबगर संलग्न किए बिना WP8 एमुलेटर पर ऐप निष्पादन को ट्रैक करने के लिए एक कंसोल या किसी अन्य तरीके की तलाश कर रहा हूं। ऐसा लगता है, क्योंकि यह हाइपर-वी वीएम पर चल रहा है, कंसोल अब और उपलब्ध नहीं है।

हालांकि मुझे थोड़ा सा काम मिल गया है। आप सरल वर्ग बना सकते हैं जो आपके संदेशों को ऐप के अलग भंडारण में लॉग ऑन करेगा (अलग भंडारण here के बारे में अधिक)। अपने ऐप को चलाने के बाद आप Windows Phone Power Tools का उपयोग करके पृथक स्टोरेज की सामग्री की जांच कर सकते हैं (सौभाग्य से इसमें "रीफ्रेश" विकल्प है ताकि आप एमुलेटर पर कुछ क्रियाएं कर सकें और फिर पृथक स्टोरेज को संशोधित कर सकें)।

12

WP8 एमुलेटर WP7 एमुलेटर का एक पूर्ण पुनर्लेख है, इसलिए यह असंभव है कि यह उसी गैर-दस्तावेज डीबग संदेशों का समर्थन करता है। दिन के अंत में सवाल यह है कि आप लॉग इन करने का प्रयास कर रहे हैं?

  • आप informaiton अपने अनुप्रयोग के लिए विशिष्ट में प्राप्त करने की कोशिश कर रहे हैं? फिर WP8 के लिए CoreCon API के माध्यम से IsoStore फ़ाइलों को साझा करने पर पावेल के विचार का उपयोग करें।
  • क्या आप एमुलेटर में दिलचस्प घटनाओं के लिए संदेश प्राप्त करने का प्रयास कर रहे हैं? एम्यूलेटर एक ईटीडब्ल्यू प्रदाता को लॉग करता है और आप उस लॉग से पढ़ सकते हैं। मैं यहाँ कैसे दिखाऊंगा।
  • क्या आप WP12 OS के अंदर से जानकारी प्राप्त करने का प्रयास कर रहे हैं? फिर एक ईटीएल फ़ाइल उत्पन्न करें और इसकी जांच करें या सीधे प्रोफाइलिंग एपीआई का उपयोग करें।

लॉगिंग एप्लिकेशन विशिष्ट संदेशों

चलो कहते हैं कि कुछ दिलचस्प एक महत्वपूर्ण बटन पर क्लिक करके अपने एप्लिकेशन में होता है। आप इसे अपने ऐप में लॉग करना चाहते हैं और उस संदेश को IsoStore (या एक कस्टम वेब सेवा पर भेजें) लिखना चाहते हैं। मैं अपने WP8 & Win8 लॉगिंग के लिए मेट्रोलॉग का उपयोग करता हूं लेकिन जब तक फ़ाइलों को IsoStore पर लिखा जाता है तब तक आप जो भी चाहें उसका उपयोग कर सकते हैं। मेट्रोलॉग @https://github.com/mbrit/MetroLog

देखें, फिर आप फ़ाइल को पढ़ने के लिए CoreCon API का उपयोग कर सकते हैं। मैं, WP8 ofr इन API का एक कोड नमूना अपलोड कर दिया है @https://stackoverflow.com/a/13429709/81687


लॉगिंग एम्यूलेटर विशिष्ट संदेशों

कहो आप जब एमुलेटर सक्रिय किया गया था देखने में रुचि रखते हैं, जब जूम स्थापित किया गया था, अगर एक स्क्रीनशॉट असफल रहा या यदि कोई स्पर्श घटना हुई। WP8 एमुलेटर उन अन्य घटनाओं को लॉग इन करने के लिए ईटीडब्ल्यू प्रदाता ff86852d-541c-4f7e-98c5-5761e8cb7074 का उपयोग करता है।आप यहां ईटीडब्लू के बारे में अधिक पढ़ सकते हैं @http://msdn.microsoft.com/en-us/magazine/cc163437.aspx

सबसे पहले, XDE.exe एमुलेटर लॉन्च करने और ईटीडब्ल्यू आउटपुट कैप्चर करना प्रारंभ करने के लिए PerfView डाउनलोड करें।

PerfView start with all the aforementioned options

  • WP8 के लिए XDE.exe के स्थान पर कार्यशील निर्देशिका सेट करें।
  • हाइपर-वी छवि बनाने के लिए पहले VS2012 से उस एमुलेटर को चलाने के लिए सुनिश्चित करें। या यदि आप जानते हैं कि आप छवि को स्वयं कैसे क्रैंक कर सकते हैं और/VHD पैरामीटर का उपयोग कर सकते हैं।
  • XDE.exe का आविष्कार करते समय आप हाइपर-वी प्रबंधक से/NAME पैरामीटर प्राप्त कर सकते हैं।
  • अतिरिक्त प्रदाता को "ff86852d-541c-4f7e-98c5-5761e8cb7074" शामिल करने के लिए सुनिश्चित करें।

अब पेर्फ व्यू से एमुलेटर चलाएं, कुछ सामान करें, एमुलेटर बंद करें और जानकारी एकत्र करना बंद करें। एक बार ऐसा करने के बाद आप एमुलेटर में चलने वाली हर चीज़ का लॉग देख सकते हैं। एक बार प्रदाता आईडी के तहत फ़िल्टर करने के बाद दिलचस्प सामग्री "ईवेंट" लॉग के अंतर्गत होती है।

PerfView events data

ऊपर प्रिंट स्क्रीन आप घटनाओं को देख सकते हैं और जब वे एमुलेटर में हुआ था। उदाहरण के लिए, इवेंट 76 माइक्रोफोन कैप्चर थ्रेड को एमुलेटर के लिए स्टार्ट किया गया है और यह प्रोफाइलिंग सत्र में 27 सेकंड हुआ। ईवेंट कोड की पूरी सूची के लिए XDE.exe असेंबली में Microsoft.Xde.Etw.WindowsPhoneEmulatorProvider c'tor देखें। यह यहाँ अपने को समझाने के लिए चिपकाया नकल है:

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

लॉगिंग हाइपर-वी से कार्यक्रमों की मेजबानी की ओएस

मान लीजिए कि आप या कैसे WP8 JITs विधानसभाओं के बारे में अधिक जानना चाहते हैं जब यह कचरा करता है संग्रह। वीएस2012 विश्लेषण उपकरण के साथ जहाजों जो उस जानकारी को प्रोफ़ाइल, स्टोर और प्रदर्शित करते हैं। उदाहरण के लिए, यहाँ कैसे एक रूपरेखा सत्र प्रारंभ करने में है:

Starting a WP8 analysis session

एक बार रूपरेखा सत्र से किया जाता है तो आप अपने ऐप के अंतर्गत "PerfLogs" फ़ोल्डर रूपरेखा सत्र के लिए डेटा है देख सकते हैं। यदि आपने CPU/निष्पादन का प्रोफाइल किया है तो आप उस फ़ोल्डर में VSPX फ़ाइलों को देख सकते हैं। VSPX फ़ाइल को ज़िप पर पुनर्नामित करें और इसमें मौजूद फ़ाइलों को निकालें। उस ज़िप में आपको एक ईटीएल फ़ाइल मिल जाएगी। वह ईटीएल फ़ाइल अभी तक एक और ईटीडब्लू लॉग है जिसे हम पेर्फव्यू की जांच कर सकते हैं।

ETL and VSPX files

जब हम PerfView में इस तरह के एक ETL फ़ाइल को खोलने हम देख सकते हैं जब प्रत्येक वर्ग JITTed था, यह कब तक लिया और आईएल & मूल निवासी आकार। उदाहरण के लिए हमारे एप्लिकेशन के अनुप्रयोग वर्ग 289.

PerfView Jitting data

के 105 के एक आईएल आकार और देशी आकार के साथ 123.461ms पर JITTed किया गया था, 1.2ms के लिए आप भी का उपयोग कर के बजाय सीधे रूपरेखा API का उपयोग करने में सक्षम हो सकता उस डेटा को कैप्चर करने के लिए VS2012। यदि ऐसा कुछ है जो आप करना चाहते हैं, तो आपको VS2012 के SilverlightProfiler इंजीनियर * *। डीएल असेंबली को रिवर्स करना होगा ताकि वे यह देख सकें कि वे क्या कर रहे हैं और VS2012 के बाहर इसे फिर से बनाएं।

+0

धन्यवाद।कोशिश करेंगे और आपको – Lokeshwer

+0

महान काम बताएंगे ... :) – StezPet

संबंधित मुद्दे