2009-01-24 16 views
17

से किसी भी फ़ंक्शन का उपयोग कर रहा है और मैं जानना चाहता हूं कि किसी निश्चित फ़ाइल से फ़ंक्शन का उपयोग करते समय प्रोग्राम को रोकने का कोई तरीका है या नहीं।जीडीबी का प्रयोग प्रोग्राम को रोकें जब यह फ़ाइल एक्स

GDB Stop when use a function from file foo.cpp 

यह करने के लिए कारण यह है कि मैं एक कोड है कि मेरा नहीं है डिबगिंग कर रहा हूँ और मैं नहीं जानता कि वास्तव में क्या काम करता है बुलाया गया कर रहे हैं और क्या काम करता है नहीं कर रहे हैं: आदर्श रूप में मैं क्या देख रहा हूँ की तरह कुछ है। क्या जीडीबी में जो कुछ मैं ढूंढ रहा हूं, या ऐसा कुछ करने के लिए कोई अन्य अनुशंसित तरीका है?

धन्यवाद

+0

कृपया स्वीकार करें: http://stackoverflow.com/a/478145/895245, यह वही है जो आप वर्तमान जीडीबी में चाहते हैं। –

उत्तर

21

चरण 1: सभी कार्यों foo.cpp
सबसे आसान तरीका में परिभाषित मैं के बारे में सोच सकते हैं की सूची का निर्माण (यह मानते हुए आप binutils है और जीएनयू grep):

nm a.out | grep ' T ' | addr2line -fe a.out | 
    grep -B1 'foo\.cpp' | grep -v 'foo\.cpp' > funclist 

चरण 2: एक GDB स्क्रिप्ट का निर्माण जो ऊपर कार्यों में से प्रत्येक पर एक को तोड़ने बिंदु सेट हो जाएगा:

sed 's/^/break /' funclist > stop-in-foo.gdb 

[जाहिर है, कदम 1 और 2 जोड़ा जा सकता है; -]

चरण 3: breakpoints वास्तव में सेट करें:

gdb a.out 
(gdb) source stop-in-foo.gdb 

this जवाब को देखते हुए, एक भी सरल (यदि आप फेडोरा लिनक्स पर कर रहे हैं) जिस तरह से पता लगाने के लिए जो foo.cpp कार्यों कहा जाता है:

ftrace -sym='foo.cpp#*' ./a.out 

बहुत खराब ftrace मैन पेज का कहना है कि यह अभी तक लागू नहीं हुआ है।

+0

मैं ऐसा करने के लिए कहने जा रहा था, लेकिन वास्तव में इसे करने के लिए +1। =) –

+1

स्थिर कार्यों को लेने के लिए प्रतीत नहीं होता है। –

0

gdb breakpoints वाक्य रचना की एक जोड़ी है ... See here.

यह फ़ाइल हालांकि किसी भी समारोह पर तोड़ नहीं होगा ....

संपादित करें: कुछ आप कर सकता है बेवकूफ बनाने की तरह बेवकूफ एक डमी फ़ंक्शन शून्य foo (शून्य), और अंदर ब्रेकपॉइंट कॉल करें। कम से कम आप फ़ाइल के अंदर तोड़ देंगे, और यह पता लगाने के लिए छोटा होना चाहिए कि फाइल एक्स के किनारे कौन सा फ़ंक्शन कॉल किया जा रहा है।

+0

यह फू फ़ंक्शन का बुरा विचार नहीं है, बात यह है कि मेरे पास कई विधियां और फ़ाइलें हैं, एकमात्र विकल्प जिसका मैं उपयोग कर सकता हूं वह रेब्रेक्स रेगेक्स है। धन्यवाद – Eduardo

2

कार्यरत रूस का जवाब बहुत अच्छा लग रहा है, लेकिन जब से तुम कहते हो:

मैं नहीं जानता कि वास्तव में क्या काम करता है बुलाया गया कर रहे हैं और क्या काम करता है नहीं हैं।

एक रिपोर्ट जो के कार्यों मारा जाता है, gcov या कुछ और के रूप में एक कोड कवरेज उपकरण ऐसे Valgrind को शामिल द्वारा उत्पन्न आपकी समस्या का एक अच्छा समाधान होगा? नियमित अभिव्यक्ति regex मिलान सभी कार्यों पर

break foo.cpp:function-name 
1

आप आदेश का उपयोग कर सकते हैं।यह आदेश सभी मैचों पर एक बिना शर्त ब्रेकपॉइंट सेट करता है, जो सेट किए गए सभी ब्रेकपॉइंट्स की सूची प्रिंट करता है। एक बार इन ब्रेकपॉइंट्स सेट हो जाने के बाद, उन्हें ब्रेक कमांड के साथ सेट ब्रेकपॉइंट्स की तरह ही माना जाता है। आप उन्हें हटा सकते हैं, उन्हें अक्षम कर सकते हैं, या किसी भी अन्य ब्रेकपॉइंट के रूप में उन्हें सशर्त बना सकते हैं।

नियमित अभिव्यक्ति का वाक्यविन्यास मानक है जिसे 'grep' जैसे टूल के साथ उपयोग किया जाता है। ध्यान दें कि यह गोले द्वारा उपयोग किए गए वाक्यविन्यास से अलग है, इसलिए उदाहरण के लिए foo * उन सभी कार्यों से मेल खाता है जिनमें शून्य या अधिक ओएस के बाद शामिल है। एक अंतर्निहित है। * आपके द्वारा आपूर्ति की जाने वाली नियमित अभिव्यक्ति का अग्रणी और पीछे हटना, ताकि foo से शुरू होने वाले केवल फ़ंक्शंस से मिलान करने के लिए^foo का उपयोग करें।

सी ++ प्रोग्राम डीबग करते समय, किसी भी विशेष कक्षा के सदस्य नहीं होने वाले अधिभारित कार्यों पर ब्रेकपॉइंट्स सेट करने के लिए रैक उपयोगी होता है।

+0

यह केवल एक समारोह को तोड़ देगा, लेकिन सवाल सभी कार्यों के लिए है। – Herbert

+0

'rbreak foo.cpp: .' 'foo.cpp' से सभी फ़ंक्शंस को तोड़ देगा जो regex' .' से मिलान करेगा (यानी,' foo.cpp' से सभी फ़ंक्शन)। – ShreevatsaR

10

rbreak regex

सेट breakpoints:

+1

यह मेरे लिए स्वीकृत उत्तर से बेहतर प्रतीत होता है :) – kizzx2

+0

इससे मुझे बहुत मदद मिली! हालांकि मुझे लगता है कि यह स्वीकार्य उत्तर नहीं हो सकता है क्योंकि यह फ़ंक्शन नामों से मेल खाता है और फ़ाइल में फ़ाइल का नाम नहीं है। –

1

rbreak foo.cpp:.

यहाँ . कुछ भी मेल खाता है, और इसलिए फ़ाइल foo.cpp के सभी कार्यों पर टूट जाता है।

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