8

मुझे सी ++ एप्लिकेशन से स्टैकट्रैक प्राप्त करने की आवश्यकता है, और इसे एक स्ट्रिंग में क्रमबद्ध करें ताकि इसे बाद में पार्स किया जा सके। विंडोज़ पर इसके लिए मैंने जो एकमात्र एपीआई सुना है वह स्टैकवॉक 64 है, जो समर्थित नहीं दिखता है।मैं WinRT में C++ से स्टैकट्रैक कैसे प्राप्त कर सकता हूं?

मैं विंडोज स्टोर ऐप में सी ++ से स्टैकट्रैक कैसे प्राप्त कर सकता हूं?

+1

यह संभव नहीं है। विश्वसनीय स्टैकवॉक को अनुमति देने के लिए सी ++ कोड बहुत अधिक अनुकूलित किया गया है। आप minidumps के साथ सी ++ दुर्घटनाओं का निदान करते हैं। स्टोर ऐप में आना मुश्किल है। –

+2

उपयोगकर्ताओं के पास एक ऐप क्रैश होने पर क्रैश डंप भेजने के लिए Windows को सक्षम करने का विकल्प होता है। फिर आप अपने डैशबोर्ड में क्रैश डंप देख सकते हैं ताकि आप इसे डाउनलोड कर सकें और इसे डीबगर में खोल सकें। –

+0

सी # कोड में यह संभव नहीं है। इनलाइनिंग और पूंछ-कॉल आपके स्टैक को पूरी तरह से अविश्वसनीय बना देंगे। GetCallingAssembly और इसके संबंधित C# कॉल को इस कारण से Windows 8 .NET प्रोफ़ाइल से निकाल दिया गया है। dbghelp.dll वह जगह है जहां कार्यक्षमता मौजूद है, और हां, यह विंडोज 8 स्टोर ऐप्स के तहत समर्थित नहीं है। आगे बढ़ें और अगर आप चाहें तो इसका अनुरोध करें, लेकिन मेरी पुस्तक में बहुत अधिक प्राथमिकता है :-) –

उत्तर

1

जटिल WINRT समस्याओं को डीबग करने में सक्षम होने का एकमात्र तरीका है कारणता श्रृंखलाओं को ट्रैक करने के लिए ईटीडब्ल्यू का उपयोग करना। सेटअप करने के लिए थकाऊ यह लेख (जबकि सी # के संदर्भ में) की तरह विधि पर प्रकाश डाला गया जबकि:

यहाँ C++/सी के लिए ETW को सभ्य परिचय के एक जोड़े हैं। डॉ Insung पार्क और रिकी बुच द्वारा MSDN लेख में

इस पद्धति का उपयोग करके आप ETW बनाने के लिए सक्षम होना चाहिए "ETW साथ डिबगिंग और प्रदर्शन ट्यूनिंग बेहतर बनाएँ" घटनाएं तब ऐप में उनके लिए सुनो और बाद में विश्लेषण के लिए उन्हें धारावाहिक स्ट्रिंग के रूप में शामिल करें।

0

मेरे लिए क्या काम किया गया है नीचे जैसा कोड है। यह केवल x86 प्लेटफ़ॉर्म पर काम करता है, इसलिए यह केवल एमुलेटर पर डिबगिंग के दौरान उपयोगी है। रिटर्न फ्रेम पॉइंटर्स का उपयोग स्रोत कोड में कूदने के लिए असंतुलन विंडो में किया जा सकता है। मुझे लगता है कि सटीक स्रोत कोड स्थान प्राप्त करने के लिए मानचित्र फ़ाइल का उपयोग करना संभव होना चाहिए।

मैं इस कोड का उपयोग स्मृति लीक खोजने के लिए करता हूं, crtdbg के साथ संयुक्त यह बहुत सारे आवंटन के साथ बहुत बड़े अनुप्रयोग में बहुत अच्छी तरह से काम करता है। वीएस 2013 मेमोरी प्रोफाइलर डेटा रिकॉर्डिंग के 1 मिनट में संभाल सकता है।

FINLINE static DWORD GetCallerFrameNum(int index) { 
#if defined(_DEBUG) && defined(_MSC_VER) && defined(_M_IX86) 

    DWORD caller = 0; 
    __asm 
    { 
     mov ebx, ebp 
     mov ecx, index 
     inc ecx 
     xor eax, eax 
     StackTrace_getCaller_next : 
     mov eax, [ebx + 4] 
     mov ebx, [ebx] 
     dec ecx 
     jnz StackTrace_getCaller_next 
     mov caller, eax 
    } 
    return caller; 

#else 

    return 0; 

#endif 
    } 

    template<class T> 
    void RecordStackTrace(T& vecOut) { 
    vecOut.clear(); 
    vecOut.reserve(32); 
    for (INT iInitLevel = 1; iInitLevel < 32; ++iInitLevel) { 
     DWORD dwFrameNum = GetCallerFrameNum(iInitLevel); 
     if (!dwFrameNum) 
     return; 
     vecOut.push_back(dwFrameNum); 
    } 
    }