2008-09-22 15 views
6

कभी-कभी मेरा सी ++ प्रोग्राम डीबग मोड में दुर्घटनाग्रस्त हो जाता है, और जो मुझे मिला वह एक संदेश बॉक्स है जिसमें कहा गया है कि कुछ आंतरिक मेमोरी प्रबंधन दिनचर्या (आवंटित स्मृति आदि तक पहुंच) में कोई दावा विफल रहा। लेकिन मुझे नहीं पता कि उसे कहां से बुलाया गया था, क्योंकि मुझे कोई स्टैक ट्रेस नहीं मिला था। मैं एक स्टैक ट्रेस कैसे प्राप्त करूं या कम से कम देख सकता हूं कि यह मेरे कोड में कहां विफल रहता है (पुस्तकालय/अंतर्निर्मित दिनचर्या के बजाय)?सी ++ प्रोग्राम क्रैश होने पर स्टैक ट्रेस कैसे प्राप्त करें? (msvc8/2005 का उपयोग करके)

उत्तर

7

यदि आपके पास कोई दुर्घटना है, तो आप इस बारे में जानकारी प्राप्त कर सकते हैं कि क्रैश हुआ था या नहीं, चाहे आपके पास डीबग या रिलीज बिल्ड हो। और आप कॉल स्टैक देख सकते हैं भले ही आप ऐसे कंप्यूटर पर हों जिसमें स्रोत कोड न हो।

ऐसा करने के लिए आपको अपनी EXE के साथ बनाई गई पीडीबी फ़ाइल का उपयोग करने की आवश्यकता है। पीडीबी फ़ाइल को उसी निर्देशिका के अंदर रखें जो EXE के रूप में क्रैश हो गया है। नोट: यहां तक ​​कि यदि आपके पास एक ही स्रोत कोड है, तो दो बार निर्माण करना और पहले EXE का उपयोग करना और दूसरा पीडीबी काम नहीं करेगा। आपको सटीक पीडीबी का उपयोग करने की आवश्यकता है जो आपके EXE के साथ बनाया गया था।

फिर क्रैश होने वाली प्रक्रिया में डीबगर संलग्न करें। उदाहरण: विंडबग या वीएस।

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

यदि आपके पास पहले से ही आपका वीएस डीबगर संलग्न है, तो यह स्वचालित रूप से स्रोत कोड पर जायेगा जो आपके लिए दुर्घटना का कारण बन रहा है।

यदि पुस्तकालय के अंदर क्रैश हो रहा है तो आप इसका उपयोग कर रहे हैं कि आपके पास पीडीबी नहीं है। आपके करने लायक कुछ नहीं है।

+0

ठीक है, कम से कम आप देख सकते हैं कि कौन सी लाइब्रेरी कॉल क्रैश का कारण बनती है। – Thomas

+0

वीएस की इंटरमीडिएट विंडो में आप टाइप कर सकते हैं (यदि आपके पास WinDBG है): ".load sos.dll" (उद्धरण के बिना) और एसओएस डीबगर का भी उपयोग करें। – user7116

0

अगर मुझे सही याद है कि संदेश बॉक्स में एक बटन होना चाहिए जो 'पुनः प्रयास' कहता है। इसके बाद उस बिंदु पर प्रोग्राम (डीबगर में) तोड़ना चाहिए जहां दावा हुआ था।

3

यदि आप वीएस के साथ मशीन पर डीबग संस्करण चलाते हैं, तो इसे इसे लाने और आपको स्टैक ट्रेस देखने की पेशकश करनी चाहिए।

समस्या यह है कि वास्तविक समस्या अब कॉल स्टैक पर नहीं है। यदि आप दो बार एक पॉइंटर मुक्त करते हैं, तो परिणामस्वरूप इस समस्या को कहीं और प्रोग्राम से संबंधित नहीं किया जा सकता है (अगली बार कुछ भी ढेर डेटास्ट्रक्चर तक पहुंचता है)

मैंने इस ब्लॉग को कॉल में समस्या दिखाने के लिए कुछ सुझावों पर लिखा ढेर ताकि आप यह पता लगा सकें कि क्या हो रहा है।

http://www.atalasoft.com/cs/blogs/loufranco/archive/2007/02/06/6-_2200_Pointers_2200_-on-Debugging-Unmanaged-Code.aspx

सबसे अच्छा टिप सूचक मुद्दों तत्काल समस्याओं का कारण बनाने के लिए gflags उपयोगिता का प्रयोग है।

+0

gflags पर जानकारी के लिए धन्यवाद, मुझे इसके बारे में कभी नहीं पता था। –

+0

मुझे लगता है कि यह उपयोगिता मुझे भविष्य में महीनों के काम को बचाएगी :) –

+0

निश्चित रूप से - जैसे ही मुझे किसी प्रकार की मेमोरी क्रैश मिलती है, मैं बस पेज हीप फीचर का उपयोग करता हूं - बहुत समय बचाता है। –

0

CrashFinder डीएलएल दिए गए अपवाद की जगह का पता लगाने और अपवाद के पते की पहचान करने में आपकी सहायता कर सकता है।
आप इस कोड को ले सकते हैं और इसे बिना किसी अपवाद के होने पर स्वचालित रूप से जेनरेट होने के लिए अपने एप्लिकेशन में एकीकृत कर सकते हैं। यह आमतौर पर __try{} __except{} का उपयोग करके या SetUnhandledExceptionFilter पर कॉल के साथ किया जाता है जो आपको सभी अनचाहे अपवादों के लिए कॉलबैक निर्दिष्ट करने की अनुमति देता है।

2

आप बिना किसी अपवाद के लिए हैंडलर सेट करके मिनी-डंप ट्रिगर कर सकते हैं।यहाँ एक article कि सभी minidumps

गूगल वास्तव में लागू किया अपने स्वयं के खुला स्रोत दुर्घटना हैंडलर BreakPad कहा जाता है, जो भी mozilla उपयोग मुझे लगता है कि के बारे में बताते हैं है (है कि आप कुछ और अधिक गंभीर चाहते हैं, तो है - एक समृद्ध और मजबूत दुर्घटना हैंडलर)।

2

This article वर्णन करता है कि स्टैक ट्रेस की गणना कैसे करें।

0

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

विंडोज़ पर डॉ वाटसन को चलकर स्थापित किया जा सकता है: drwtsn32 -idrwtsn32 चल रहा है (बिना किसी विकल्प के) कॉन्फ़िगरेशन संवाद लाएगा। यह क्रैश डंप फ़ाइलों के निर्माण की अनुमति देगा, जिसे आप बाद में WinDbg या कुछ समान के साथ विश्लेषण कर सकते हैं।

-1

आप इसके लिए Poppy का उपयोग कर सकते हैं। आप बस अपने कोड में कुछ मैक्रोज़ छिड़कते हैं और यह वास्तविक पैरामीटर मान, स्थानीय चर, लूप काउंटर इत्यादि के साथ स्टैक ट्रेस इकट्ठा करेगा। यह बहुत हल्का है इसलिए इसे रिलीज बिल्ड में छोड़ा जा सकता है ताकि इस जानकारी को दुर्घटनाओं से इकट्ठा किया जा सके एंड-यूजर मशीनों पर

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