2009-05-12 17 views
11

से डीबगिंग जानकारी निकालने के लिए कैसे करें यदि मेरा सी ++ ऐप विंडोज़ पर क्रैश हो जाता है तो मैं अपने सर्वर पर उपयोगी डीबगिंग जानकारी भेजना चाहता हूं।क्रैश

लिनक्स पर मैं जीएनयू backtrace() फ़ंक्शन का उपयोग करूंगा - क्या विंडोज के बराबर है?

क्या कोई प्रोग्राम क्रैश होने के बाद उपयोगी डीबगिंग जानकारी निकालने का कोई तरीका है? या केवल प्रक्रिया के भीतर से?

(की तर्ज पर सलाह "परीक्षण आप अनुप्रयोग तो यह दुर्घटना नहीं है" उपयोगी नहीं है - सभी गैर तुच्छ कार्यक्रमों कीड़े होगा)

उत्तर

7

फ़ंक्शन Stackwalk64 का उपयोग विंडोज पर एक स्टैक ट्रेस स्नैप करने के लिए किया जा सकता है।

यदि आप इस फ़ंक्शन का उपयोग करना चाहते हैं, तो आपको अपने कोड को एफपीओ अक्षम के साथ संकलित करना सुनिश्चित करना चाहिए - प्रतीकों के बिना, StackWalk64 ठीक से FPO'd फ्रेमों को चलाने में सक्षम नहीं होगा।

आप SetUnhandledExceptionFilter को कॉल करके शीर्ष-स्तर __try/__except ब्लॉक के माध्यम से क्रैश के समय प्रक्रिया में कुछ कोड चला सकते हैं। यह थोड़ा अविश्वसनीय है क्योंकि इसके लिए आपको क्रैश प्रक्रिया के अंदर कोड चलाने की आवश्यकता है। वैकल्पिक रूप से, आप केवल क्रैश डेटा एकत्र करने के लिए अंतर्निहित Windows त्रुटि रिपोर्टिंग कर सकते हैं। यह अधिक विश्वसनीय है, क्योंकि आपको समझौता, क्रैश प्रक्रिया के अंदर चलने वाले कोड को जोड़ने की आवश्यकता नहीं है। एकमात्र लागत कोड-हस्ताक्षर प्रमाण पत्र प्राप्त करना है, क्योंकि आपको सेवा में एक हस्ताक्षरित बाइनरी जमा करनी होगी। https://sysdev.microsoft.com/en-US/Hardware/signup/ में अधिक जानकारी है।

+0

WER क्रैश डेटा पुनर्प्राप्त करने के लिए आपकी बाइनरी पर हस्ताक्षर करने की आवश्यकता नहीं है। इसके बजाए, आप एक विशेष उपकरण चलाते हैं जो आपकी बाइनरी स्कैन करता है और फ़ाइल नाम, टाइमस्टैम्प, सीआरसी इत्यादि एकत्र करता है। टूल इस जानकारी को एक XML फ़ाइल में सहेजता है जिसे आप Winqual पर अपलोड करते हैं। – bk1e

+0

हस्ताक्षरित बाइनरी पहचान स्थापित करना है। Http://www.microsoft.com/whdc/winlogo/maintain/StartWER.mspx: कंपनियों को प्रतिरूपण से बचाने के लिए और यह सुनिश्चित करने के लिए कि त्रुटि रिपोर्ट सही कंपनी के प्रतिनिधि के पास जाती है, Winqual वेबसाइट को आपकी कंपनी की आवश्यकता होती है वैध VeriSign आईडी रखने के लिए। – Michael

2

इस वेबसाइट पर ढेर पुनः प्राप्ति के काफी विस्तृत अवलोकन प्रदान करता है Win32 एक सी ++ अपवाद के बाद:

http://www.eptacom.net/pubblicazioni/pub_eng/except.html

बेशक

, यह केवल प्रक्रिया के भीतर से काम करेंगे, इसलिए यदि प्रक्रिया को समाप्त कर या जहां यह है कि कोड से पहले समाप्त हो जाता है करने के लिए दुर्घटनाओं हो जाता चलाया जाता है, यह जीत लिया ' टी काम नहीं

2

एक मिनीडम्प फ़ाइल जेनरेट करें। इसके बाद आप इसे windbg या विजुअल स्टूडियो में लोड कर सकते हैं और पूरे स्टैक का निरीक्षण कर सकते हैं जहां दुर्घटना हुई थी।

Here's पढ़ने शुरू करने के लिए एक अच्छी जगह है।

+0

दुर्भाग्यवश MiniDumpWriteDump को कुछ विशेषाधिकारों की आवश्यकता है, जिन्हें मैं अपने उपयोगकर्ताओं के पास नहीं मान सकता – hoju

3

यदि आप अपना कोड रोल करना चाहते हैं तो आप Windows API कॉल MiniDumpWriteDump का उपयोग कर सकते हैं। विंडोज एक्सपी और विस्ट दोनों ही इस प्रक्रिया को स्वचालित करते हैं और आप त्रुटि रिपोर्ट तक पहुंच प्राप्त करने के लिए https://winqual.microsoft.com पर साइन अप कर सकते हैं।

अन्य समाधानों के लिए http://kb.mozillazine.org/Breakpad और http://www.codeproject.com/KB/debug/crash_report.aspx देखें।

2

वर्तमान स्टैकफ्रेम पते को लॉग फ़ाइल में डंप करने के लिए यह काफी आसान है। आपको बस इतना करना है कि इस तरह के एक समारोह को प्रोग्राम दोषों (यानी विंडोज़ में एक इंटरप्ट हैंडलर) या आवेषण पर बुलाया जाता है। यह रिलीज़ संस्करणों पर भी किया जा सकता है। लॉग फ़ाइल को तब मैप फ़ाइल के साथ मेल किया जा सकता है जिसके परिणामस्वरूप फ़ंक्शन नामों के साथ कॉल स्टैक होता है।

मैंने कुछ साल पहले इस बारे में एक लेख प्रकाशित किया था।

, http://www.ddj.com/architect/185300443

1

आप एक क्रम दुर्घटना के लिए एक callstack (प्लस अन्य अच्छे जानकारी) हड़पने के लिए चाहते हैं, तो देखें एक रिलीज के निर्माण पर भी साइट पर है, तो आप (Drwtsn32.exe चलाने) Dr Watson स्थापित करने के लिए की जरूरत है।यदि आप 'क्रैश डंप उत्पन्न करते हैं' विकल्प की जांच करते हैं, जब कोई ऐप क्रैश हो जाता है, तो यह निर्दिष्ट पथ (जिसे user.dmp कहा जाता है) पर एक मिनी डंप फ़ाइल लिखेंगे।

आप इसे ले सकते हैं, जब आप अपना सर्वर बनाते हैं तो इसे बनाए गए प्रतीकों के साथ संयोजित करें (इसे अपने कंपाइलर/लिंकर में पीडीबी फाइलें उत्पन्न करने के लिए सेट करें - इन्हें घर पर सुरक्षित रखें, आप उन्हें डंप से मेल खाने के लिए उपयोग करते हैं ताकि वे उस स्रोत को काम करें जहां दुर्घटना हुई थी)

अपने आप को windbg प्राप्त करें, इसे खोलें और 'क्रैश डंप लोड' करने के लिए मेनू विकल्प का उपयोग करें। एक बार यह सब कुछ लोड हो जाने पर आप प्रत्येक थ्रेड के लिए कॉलस्टैक प्राप्त करने के लिए '~ # केपी' टाइप कर सकते हैं (या वर्तमान थ्रेड के लिए शीर्ष पर दिए गए बटन पर क्लिक करें)।

वहाँ This one मेरी पसंदीदा है, पता है कि कैसे वेब पर यह करने के लिए अच्छा लेख है, और आप read this चाहता हूँ helpyourself के लिए कैसे वास्तव में आसानी से प्रतीकों का प्रबंधन की समझ पाने के लिए।

1

आपको अपने आवेदन में एक डंप पीढ़ी ढांचा स्थापित करना होगा, here यह है कि आप इसे कैसे कर सकते हैं।

फिर आप डंप विश्लेषक जैसे विंडबग का उपयोग करके आगे विश्लेषण के लिए सर्वर पर डंप फ़ाइल अपलोड कर सकते हैं।

2

मुझे बताएं कि मैं अपने सी ++/डब्ल्यूटीएल एप्लिकेशन में क्रैश कैसे संभालता हूं।

सबसे पहले, मुख्य समारोह में, मैं _set_se_translator पर कॉल करता हूं, और एक फ़ंक्शन में पास करता हूं जो संरचित विंडोज अपवादों का उपयोग करने के बजाय सी ++ अपवाद फेंक देगा। इस फ़ंक्शन को एक त्रुटि कोड मिलता है, जिसके लिए आप FormatMessage और एक PEXCEPTION_POINTERS तर्क के माध्यम से एक Windows त्रुटि संदेश प्राप्त कर सकते हैं, जिसका उपयोग आप minidump (code here) लिखने के लिए कर सकते हैं। तुम भी मिनीडम्प फ़ाइल निश्चित "मंदी" त्रुटियों है कि आप बस से जमानत चाहिए, EXCEPTION_NONCONTINUABLE_EXCEPTION या EXCEPTION_STACK_OVERFLOW :) की तरह के लिए अपवाद कोड की जांच कर सकते (यदि यह वसूली योग्य है, मैं उपयोगकर्ता मुझे इस मिनीडम्प फ़ाइल ईमेल करने के लिए संकेत।)

खुद को एक सामान्य प्रोजेक्ट की तरह विजुअल स्टूडियो में खोला जा सकता है, और आपको अपने निष्पादन योग्य के लिए एक .pdb फ़ाइल प्रदान करने के लिए, आप प्रोजेक्ट चला सकते हैं और यह कॉल स्टैक के साथ क्रैश के सटीक स्थान पर कूद जाएगा और रजिस्टर्स, जिन्हें डीबगर से जांच की जा सकती है।

0

आप क्रैश कॉलस्टैक को कैप्चर करने के लिए एडप्लस का उपयोग करना चाह सकते हैं।

आप विंडोज के लिए डिबगिंग टूल डाउनलोड और इंस्टॉल कर सकते हैं। adplus की

प्रयोग यहाँ बताया गया है: Adplus usage

यह पूरा दुर्घटना बनाता है या डंप लटका। एक बार जब आप डंप हो जाते हैं, तो विंडबग बचाव के लिए आता है। सही पीडीबीएस और प्रतीकों को मानचित्र करें और आप डंप का विश्लेषण करने के लिए तैयार हैं। उपयोग के साथ शुरू करने के लिए "! विश्लेषण -v"

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