2010-05-17 19 views
5

में पकड़े गए देशी अपवादों से मूल स्टैकट्रैक कैसे प्राप्त करें मेरे पास कुछ प्रबंधित कोड है जो कुछ देशी DLL (मेरे पास उचित प्रतीक फाइलें) के अंदर एक विधि को कॉल करता है।
कभी-कभी, वह मूल विधि एक अपवाद फेंकता है जिसे मैं अपने प्रबंधित कोड में पकड़ता हूं। हालांकि, जब मैं अपने पकड़े गए अपवाद से स्टैकट्रैक प्रिंट करता हूं, तो मुझे केवल प्रबंधित कोड दिखाई देता है (अंतिम फ्रेम देशी कोड पर कॉल है .. लेकिन यह मूल कोड के भीतर स्टैकट्रैक नहीं देखता है)।प्रबंधित कोड

मैं मूल कॉलस्टैक भी कैसे प्राप्त कर सकता हूं?
* जब मैं कोड डीबग कर रहा हूं, तो मैं मूल कोड में कदम उठाने में सक्षम हूं, और actuall कॉल स्टैक देख सकता हूं।

उत्तर

1

मूल स्टैक ट्रेस प्राप्त करना काफी मुश्किल है। जब तक यह .NET/मूल अनुवाद परत से गुज़रता है, तब तक देशी स्टैक ट्रेस पहले ही खो गया है।

तो, आपको देशी कोड में अभी भी इसे कैप्चर करने की आवश्यकता है, और यह भी काफी मुश्किल है। उचित मूल स्टैक ट्रेसिंग के लिए जॉन रॉबिन्स के काम पर नज़र डालें; उनके सुपरएस्सेरेट का नवीनतम सार्वजनिक रूप से उपलब्ध संस्करण जो मुझे मिल सकता है MSJ, Feb 1999 से है।

+1

-1 अनुवाद करें, "मुझे नहीं पता कि यह कैसे करना है, इसलिए मैं जो कुछ नहीं जानता उसके बारे में शब्दकोष लिखने जा रहा हूं, फिर यादृच्छिक Google खोज लिंक" असली सहायक। –

+0

असल में, मैंने इसे किया है (अविश्वसनीय रूप से एक देशी स्टैक ट्रेस पर कब्जा कर लिया - अप्रबंधित कोड से)। सुपरएसरर्ट से पहले भी लिखा गया था। उसे लो। : पी –

+0

क्षमा करें, मैं "मुश्किल" शब्द को एक भौह उठाता हूं। "मुश्किल" आमतौर पर अनुवाद, कठिन अनुसंधान, या बनाए रखने के लिए मुश्किल में अनुवाद करता है। क्योंकि कह रहा है कि कोड मुश्किल है, ज्यादा समझ में नहीं आता है। मुझे लगता है कि इसे अधिक रखरखाव की आवश्यकता नहीं होगी, इसलिए मैंने पहले माना। –

1

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

स्टैकवॉकर का उपयोग करने की एक और संभावना है। यह मुफ़्त है और यहां उपलब्ध है: http://www.codeproject.com/KB/threads/StackWalker.aspx यदि आप शीर्ष-स्तरीय देशी कॉल जानते हैं, तो आप इसे __try/__ पकड़ से लपेट सकते हैं और स्टैकवॉकर का उपयोग स्टैकवॉकर को लॉग फ़ाइल में डंप करने के लिए कर सकते हैं। संभवतः आप अपवाद भी पकड़ सकते हैं, स्टैकवॉकर का उपयोग करके कॉल स्टैक प्राप्त कर सकते हैं, अपवाद में कॉलस्टैक जोड़ सकते हैं (एक स्ट्रिंग के रूप में), और उसके बाद अपवाद को अपने .NET कोड में पुनर्स्थापित करें। .NET कोड तब आपके अपवाद से कॉलस्टैक प्राप्त कर सकता है।

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