2009-02-02 24 views
39

क्या कोई जीसीसी विकल्प है जो मैं सेट कर सकता हूं जो मुझे सेगमेंटेशन गलती की लाइन नंबर देगा?सेगमेंटेशन गलती की लाइन संख्या

मैं जानता हूँ कि मैं कर सकते हैं: लाइन द्वारा

  1. डीबग लाइन कोड में
  2. रखें printfs को कम करने के लिए।

संपादन:

  1. bt/where gdb पर देना नहीं ढेर।
  2. Helpful suggestion
+0

क्या आप अपने कंपाइलर झंडे पोस्ट कर सकते हैं? – cbrulak

+0

gcc -DDEBUG -I "" -O0 -g3 -Wall -c -fmessage-length = 0 -MMD -MP – Rohit

+0

(अगली बार, कृपया अपना कोड अपने प्रश्न में रखें)। – cbrulak

उत्तर

54

मैं एक जीसीसी विकल्प के बारे में पता नहीं है, लेकिन आप gdb के साथ और उसके बाद जब यह दुर्घटनाओं, प्रकार where एक नज़र ढेर पर जब यह बाहर निकल गया लेने के लिए एप्लिकेशन को चलाने के लिए सक्षम होना चाहिए, जो आपको बंद कर लेना चाहिए। पूर्णता के लिए

$ gdb blah 
(gdb) run 
(gdb) where 

संपादित करें:

तुम भी -g जीसीसी विकल्प का उपयोग करने के लिए निष्पादन योग्य में लाइन नंबर शामिल करने के लिए पर डिबग झंडे के साथ आवेदन निर्माण करने के लिए यह सुनिश्चित करना चाहिये।

एक और विकल्प bt (बैकट्रैक) कमांड का उपयोग करना है।

+2

यदि "नो स्टैक" कहां दिखाता है तो मैं क्या करूँ? – Rohit

+0

कुछ क्रैश स्थिर सामग्री को दूषित कर सकते हैं और फिर आप प्रिंट कोड डालने और विभिन्न कोड बिंदुओं पर इनपुट की वैधता की जांच करने के साथ शायद सबसे अच्छे हैं। – che

+2

आप नीचे दिए गए मेरे सुझाव का भी प्रयास कर सकते हैं - यह ग्लिब के स्टैक को जीडीबी का सहारा लेने के लिए एक स्टैकट्रैक w/o को मुद्रित करने के लिए दिनचर्या को अनदेखा करता है। – tgamblin

4

आप भी (आप हालांकि जी की जरूरत है) जी

पर डिबग झंडे के साथ निर्माण करने के लिए आप भी gdb के साथ कोर डंप खोल सकते हैं की जरूरत है।

+0

ब्रुलक स्पॉट-ऑन है, अगर आपको gdb में स्टैक नहीं मिल रहा है, तो आपको अपने प्रतीकों को ठीक करने की आवश्यकता है –

1

इस जानकारी को प्रदान करने के लिए जीसीसी के लिए कोई विधि नहीं है, आपको जीडीबी जैसे बाहरी कार्यक्रम पर भरोसा करना होगा।

जीडीबी आपको उस लाइन को दे सकता है जहां प्रोग्राम "सीटी" के लिए "बीटी" ("बैकट्रैस" के लिए छोटा) कमांड के साथ एक दुर्घटना हुई है। यह आपको न केवल क्रैश की रेखा देगा, बल्कि कार्यक्रम का पूरा ढेर देगा (ताकि आप देख सकें कि क्रैश हुआ जहां फ़ंक्शन कहलाता है)।

19

यहां एक संपूर्ण खोल/gdb सत्र

 
$ gcc -ggdb myproj.c 
$ gdb a.out 
gdb> run --some-option=foo --other-option=bar 
(gdb will say your program hit a segfault) 
gdb> bt 
(gdb prints a stack trace) 
gdb> q 
[are you sure, your program is still running]? y 
$ emacs myproj.C# heh, I know what the error is now... 

हैप्पी हैकिंग :-) है

+2

बीटी और जहां "नो स्टैक" देता है। मुझसे इसका समाधान किस प्रकार होगा? – Rohit

+5

आप इसे अपने कंप्यूटर पर चलाते हैं ;-) [क्षमा करें] –

9

आप जब अपने कार्यक्रम एक SEGV संकेत, के समान हो जाता है आप एक स्टैकट्रेस मुद्रित करने के लिए जीसीसी प्राप्त कर सकते हैं कैसे जावा और अन्य दोस्ताना भाषाएं शून्य सूचक अपवादों को संभालती हैं। यहाँ अधिक जानकारी के लिए मेरा उत्तर देखें:

इस बारे में अच्छी बात यह है कि आप सिर्फ अपने कोड में छोड़ सकता है; अच्छा डीबग आउटपुट प्राप्त करने के लिए आपको gdb के माध्यम से चीजों को चलाने की आवश्यकता नहीं है।

यदि आप वहां संकलित करते हैं और वहां निर्देशों का पालन करते हैं, तो आप आउटपुट से फ़ाइल/लाइन जानकारी प्राप्त करने के लिए addr2line जैसे कमांड लाइन टूल का उपयोग कर सकते हैं।

+0

लिंक टूटा हुआ है ... सही एक है: http://stackoverflow.com/questions/77005/how-to-generate-a-stacktrace-when- मेरी-जीसीसी-ग-ऐप्लिकेशन-दुर्घटनाओं –

3

सभी पूर्ववर्ती सुझाव डिबगिंग (जी) के साथ संकलन और एक डिबगर के तहत चलाए (gdb, चला, बीटी) आप के लिए काम नहीं कर रहे है, तो करने के लिए करते हैं:

  • प्राथमिक: हो सकता है आप नहीं कर रहे हैं डीबगर के तहत चल रहा है, आप बस पोस्टमॉर्टम कोर डंप का विश्लेषण करने की कोशिश कर रहे हैं। (यदि आप डीबग सत्र शुरू करते हैं, लेकिन प्रोग्राम को न चलाएं, या यदि यह निकलता है, तो जब आप बैकट्रैक मांगते हैं, तो gdb "नो स्टैक" कहेंगे - क्योंकि कोई रनिंग प्रोग्राम नहीं है। भूलना न भूलें "रन" टाइप करने के लिए।) यदि यह segfaulted है, तो जब आप gdb चलाते हैं तो तीसरा तर्क (core) जोड़ने के लिए मत भूलना, अन्यथा आप उसी स्थिति में प्रारंभ करते हैं, किसी भी विशेष प्रक्रिया या स्मृति छवि से जुड़ा नहीं है।
  • मुश्किल: यदि आपका प्रोग्राम वास्तव में चल रहा है/वास्तव में चल रहा है लेकिन आपका जीडीबी कह रहा है "कोई ढेर नहीं" शायद आपका स्टैक पॉइंटर बुरी तरह टूट गया है। इस मामले में, आप कहीं भी एक बफर ओवरफ्लो समस्या हो सकती है, जो आपके रनटाइम राज्य को पूरी तरह से मैश करने के लिए पर्याप्त गंभीर है। जीसीसी 4.1 प्रोपोलिस "स्टैक स्मैशिंग प्रोटेक्टर" का समर्थन करता है जो -fstack-protector-all के साथ सक्षम है। इसे पैच के साथ जीसीसी 3.x में जोड़ा जा सकता है।
5

इसे वालग्रिंड के नीचे चलाएं।

1

No stack समस्या तब होती है जब प्रोग्राम सफलतापूर्वक बाहर निकलता है।

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

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