2010-11-01 13 views
10

के लिए सर्वश्रेष्ठ डीबगिंग टूल मैं यूनिक्स पर सी/सी ++ पर काम कर रहा हूं और अक्सर कोर फाइलें देखता हूं। कोर या सेगमेंटेशन गलती के वास्तविक कारण को खोजने के लिए कई बार मूल फ़ाइलों को डीबग करना मुश्किल होता है। क्या आप कृपया मुझे एक कुशल डीबगर सुझा सकते हैं?सी और सी ++

+3

आप किस कंपाइलर का उपयोग कर रहे हैं? डीबगर को आपके कंपाइलर द्वारा उत्पन्न डीबग प्रतीकों को पढ़ने की आवश्यकता है। आम तौर पर जीडीबी जीसीसी के साथ सबसे अच्छा होता है, डीसीएक्स सन सीसी, आदि – Rup

+0

मैं यूनिक्स –

+1

पर सीसी का उपयोग कर रहा हूं सचिन: यह वास्तव में हमें बहुत कुछ नहीं बताता है। कौन सी सीसी'? कौन सा यूनिक्स? – Ken

उत्तर

8

मैं * nix समर्थन -g के सबसे जायके पर सबसे सी compilers वस्तु फ़ाइलों के भीतर प्रतीकों डिबगिंग शामिल करने के लिए लगता है, इसलिए यदि आप करते हैं: फिर

cc -g -c file1.c 
cc -g -c file2.c 
cc -g file1.o file2.o -o program 
./program 

जब आप प्रोग्राम चलाने अगर यह दुर्घटनाओं यह एक प्रस्तुत करना चाहिए अधिक आसानी से डीबग कोर फ़ाइल। पहली दो पंक्तियां सिर्फ स्रोत फ़ाइलों को संकलित करती हैं (.o फाइलें उत्पन्न करती हैं), तीसरी पंक्ति कंपाइलर को स्रोत फ़ाइलों को निष्पादन योग्य में जोड़ने के लिए लिंकर को कॉल करने के लिए कहती है (-g पास करने से वास्तव में कुछ भी नहीं हो सकता है अगर लिंकर को ऐसा करने की ज़रूरत नहीं है डिबगिंग प्रतीकों के साथ निष्पादन योग्य उत्पादन करने के लिए कुछ भी विशेष है, लेकिन इसे कुछ भी नुकसान नहीं पहुंचाया जाना चाहिए), और अंतिम पंक्ति कार्यक्रम चलाती है। आपको यह सुनिश्चित करना चाहिए कि जब आप डीबग करने का प्रयास कर रहे हों तो संकलक को अनुकूलन करने के लिए न कहें (जब तक आपको पता न लगे कि ऑप्टिमाइज़ेशन चालू होने तक इसमें त्रुटियां नहीं हैं) क्योंकि ऑप्टिमाइज़ेशन आमतौर पर अनुसरण करना अधिक कठिन बनाते हैं।

चूंकि मुझे नहीं पता कि आप किस प्लेटफ़ॉर्म पर हैं या आपके पास कौन से टूल्स उपलब्ध हैं (या वास्तव में आप कौन सी सी कंपाइलर उपयोग कर रहे हैं) इसलिए अधिक विशिष्ट सलाह देना मुश्किल है। आपको अपने अनुपालन के लिए मैन पेज (मैनुअल) पढ़ना चाहिए।

man cc 

और वह एक मैन्युअल पृष्ठ जो आपके सिस्टम पर संकलक के बारे में बताता चीजों के बहुत सारे ऊपर लाना चाहिए: कमांड लाइन प्रकार से। यह आपको बता सकता है कि संकलक को अधिक चेतावनी संदेश बनाने के लिए कैसे बताना है, जो आपके प्रोग्राम चलाने से पहले आपकी त्रुटियों को ढूंढने में आपकी सहायता कर सकता है। (ध्यान दें कि कुछ चेतावनियां केवल तभी बनाई जा सकती हैं जब आप कुछ अनुकूलन के साथ संकलित हो जाएं, भले ही आप शायद अनुकूलित प्रोग्राम को डीबग नहीं करना चाहें, आप इसे ऑप्टिमाइज़ेशन के साथ संकलित करना चाहते हैं और अतिरिक्त चेतावनियां सिर्फ यह देखने के लिए चालू हैं कि वे आपको कुछ बताओ)।

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

gdb ./program 

यह आपके प्रोग्राम को चलाने के लिए तैयार हो जाएगा। यदि आप कार्य करें:

gdb ./program ./core 

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

(gdb) bt 

यहाँ (gdb) करने के लिए संकेत है और bt एक आदेश है कि एक बैक-ट्रेस निर्माण करने के लिए कहते हैं है। इसका मतलब है कि एक कॉल स्टैक, जो दिखाता है कि विफलता कब हुई थी, और उस फ़ंक्शन को किस फ़ंक्शन को बुलाया गया था, और उस फ़ंक्शन को किस फ़ंक्शन को और पहले फ़ंक्शन पर और उसके बाद क्या किया गया था। यह भ्रमित हो सकता है क्योंकि यह अक्सर लाइब्रेरी फ़ंक्शंस को सबसे हालिया कहा जाता है, लेकिन इसका आमतौर पर मतलब है कि आप समस्या के कारण कहीं भी खराब डेटा में पास हुए हैं।

gdb एक बड़ा और जटिल प्रोग्राम है, इसलिए यदि यह आपके सिस्टम पर है तो आपको इसे पढ़ने के लिए समय लेना चाहिए।

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

2

आम तौर पर, gdb एक उत्कृष्ट डीबगर है (हालांकि यह सीखने में थोड़ा सा लगता है)। विभिन्न फ्रंटेंड्स भी हैं, कुछ जीयूआई के साथ, जैसे कि डीडीडी या सीजीडीबी।

यदि आप समझते हैं कि आपको विशेष रूप से परेशानी हो रही है, तो हम बेहतर ढंग से अनुशंसा कर सकते हैं कि कौन सी डीबगर आपको सबसे अधिक मदद करेगा।

7

gdb का उपयोग करें। यह डिफैक्टो मानक यूनिक्स सी/सी ++ डीबगर है और संस्करण 7.0 के रूप में रिवर्सिबल डीबगिंग सुविधाएं हैं (आप समय पर पीछे जा सकते हैं)। अकेले इन कारणों से इसे जांचने के लिए इसे कम से कम सार्थक बना दिया जाता है।

10

सेगमेंटेशन दोष, मेमोरी लीक, अनियमित डेटा और इस तरह के लिए, valgrind के माध्यम से अपना प्रोग्राम चलाने के लिए हमेशा एक अच्छा विचार है। यदि आप विशेष रूप से स्मृति रिसाव में रुचि रखते हैं, तो विकल्प "--leak-check = full" का भुगतान करता है।

और हाँ, जीडीबी सीखें। इसमें थोड़ा समय लगता है, लेकिन यह इसके लायक है।

+0

नोट यह ऐसा कुछ है जो आप करेंगे यदि आपके पास कोर को पुन: पेश करने का एक सतत तरीका है और कारण को इंगित करना चाहते हैं। valgrind कोर फ़ाइलों को संसाधित नहीं करता है जो पहले से ही उत्पन्न हो चुके हैं। – aschepler

3

मुझे वास्तव में कुलदृश्य पसंद है। समानांतर डिबगिंग विशेषताएं मुझे उतनी ही पसंद करती हैं जितनी मैं करता हूं।