2012-03-03 22 views
17

हम एप्लिकेशन में सभी कार्यों को कैसे सूचीबद्ध कर सकते हैं। मैंने जीडीबी का उपयोग करने की कोशिश की लेकिन इसकी बैकट्रैक सूची केवल मुख्य फंक्शन कॉल तक है।किसी एप्लिकेशन में किए गए सभी फ़ंक्शन कॉल की सूची

मुझे गहन सूची की आवश्यकता है i.e मुख्य कार्यों द्वारा बुलाए जाने वाले सभी कार्यों की सूची और इन फ़ंक्शंस फ़ंक्शंस से फ़ंक्शन को बुलाया जा रहा है।

क्या यह gdb में प्राप्त करने का कोई तरीका है? या क्या आप मुझे यह कैसे प्राप्त कर सकते हैं इस पर सुझाव दे सकते हैं?

+0

किसी भी उपकरण के साथ: http://stackoverflow.com/questions/311840/tool-to-trace-local-function-calls-in-linux?lq=1 –

+0

संभावित डुप्लिकेट [जीडीबी प्रिंट कंट्रोल फ्लो को फ़ंक्शन के रूप में बनाएं] (http://stackoverflow.com/questions/311948/make-gdb-print-control-flow-of-functions-as-they-are- कहा जाता है) – jww

+0

https://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/ –

उत्तर

17

हम कैसे सूचीबद्ध कर सकते हैं सभी कार्यों के लिए एक आवेदन

किसी भी वास्तविक आकार आवेदन के लिए में बुलाया जा रहा है, इस सूची में प्रविष्टियों के हजारों, जो संभवत: यह बेकार कर देगा होगा।

आप nm आदेश, उदा एक आवेदन में सभी कार्यों परिभाषित (लेकिन जरूरी नहीं बुलाया) पता कर सकते हैं

nm /path/to/a.out | egrep ' [TW] ' 

तुम भी प्रत्येक कार्य पर एक ब्रेकपाइंट सेट करने के लिए GDB का उपयोग कर सकते हैं:

(gdb) set logging on  # collect trace in gdb.txt 
(gdb) set confirm off # you wouldn't want to confirm every one of them 
(gdb) rbreak .   # set a breakpoint on each function 

एक बार जब आप जारी रखने के लिए, आप कहा जाता है प्रत्येक कार्य के लिए एक ब्रेकपाइंट मारा जाएगा। आगे बढ़ने के लिए disable और continue आदेशों का उपयोग करें। मुझे विश्वास नहीं है कि इसे स्वचालित करने का एक आसान तरीका है, जब तक कि आप पाइथन स्क्रिप्टिंग का उपयोग नहीं करना चाहते।

पहले से ही उल्लेख किया गया है gprof एक और अच्छा विकल्प है।

+0

नोट: यह कोड पर भी टूट जाएगा जो '_start' से पहले चलता है: http : //stackoverflow.com/questions/31379422/why-is-init-from-glibcs-csu-init-first-c-called-before-start-even-if-start-i –

+0

gdb 100% पर बैठा है cpu क्योंकि मैंने लॉग इन किए बिना 'rbreak .' –

+0

कमांड दर्ज किया है,' ऊंचाई 0 सेट करें 'सहायक होगी (आउटपुट के लिए कोई पेजिंग नहीं) – Blauhirn

9

आप एक कॉल ग्राफ चाहते हैं। जिस टूल का आप उपयोग करना चाहते हैं वह gdb नहीं है, यह gprof है। आप अपने प्रोग्राम को -pg से संकलित करें और फिर इसे चलाएं। जब यह फ़ाइल चलाता है gmon.out का उत्पादन किया जाएगा। फिर आप gprof के साथ इस फ़ाइल को संसाधित करते हैं और आउटपुट का आनंद लेते हैं।

1

इस प्रश्न के लिए वर्तमान में 2 उत्तरों के बीच निर्णय लेने के लिए स्पष्टीकरण की आवश्यकता हो सकती है। आपको जिस चीज की आवश्यकता है उस पर निर्भर करता है:

1) आपको यह जानने की जरूरत है कि कॉल के # से मेल खाने वाले कार्यों की सीधी सूची/ग्राफ़ प्रारूप में प्रत्येक फ़ंक्शन को कितनी बार बुलाया जा रहा है। इससे संदिग्ध/असंगत परिणाम हो सकते हैं यदि आपका कोड प्रक्रियात्मक नहीं है (यानी किसी अन्य शाखा को ढांचे के बाहर ढंके कार्यों को बुलाए जाने की अस्पष्टता के बिना)। यह मूल gprof कार्यक्षमता है जिसके लिए -जीजी ध्वज के साथ पुनर्मूल्यांकन की आवश्यकता है।

2) आपको उस क्रम में कार्यों की एक सूची की आवश्यकता है जिसमें उन्हें बुलाया गया था, यह आपके कार्यक्रम पर निर्भर करता है जो सबसे अच्छा/व्यवहार्य विकल्प है: ए) यदि आपका प्रोग्राम रनटाइम त्रुटियों के बिना चलता है और समाप्त हो जाता है तो आप gprof का उपयोग कर सकते हैं इस उद्देश्य के लिए। बी) लॉगिंग और ब्रेक पॉइंट्स के साथ डीबीजी का उपयोग करने से ऊपर ईएलएसई विकल्प यह है कि मैंने इसे पढ़ने पर सीखा है।

3) आपको न केवल आदेश जानने की आवश्यकता है, उदाहरण के लिए, प्रत्येक कॉल के लिए फ़ंक्शन तर्क भी। मेरा वर्तमान काम कण परिवहन के भौतिकी में सिमुलेशन है, इसलिए यह असंगत परिणाम कहां से आ रहा है, इस पर नजर रखने में उपयोगी होगा ... यानी जब तर्कों को समझने के लिए पारित होने के तर्क पारित हो जाते हैं।मैं एक तरह से यह करने के लिए सोच भी है रूस निम्न का उपयोग कर को छोड़कर क्या कार्यरत किया पर एक बदलाव होगा:

(gdb) की जानकारी आर्ग

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

4

रिकॉर्ड समारोह-कॉल-इतिहास

https://sourceware.org/gdb/onlinedocs/gdb/Process-Record-and-Replay.html

यह एक बढ़िया हार्डवेयर संभावना त्वरित यदि आप एक सीपीयू कि Intel Processor Tracing का समर्थन करता है के साथ कुछ लोगों को (2015) में से एक है होना चाहिए (इंटेल पीटी, intel_pt/proc/cpuinfo में)।

GDB डॉक्स का दावा है कि ऐसा लगता है कि उत्पादन का उत्पादन कर सकते हैं: यह प्रयोग करने से पहले

(gdb) list 1, 10 
1 void foo (void) 
2 { 
3 } 
4 
5 void bar (void) 
6 { 
7  ... 
8  foo(); 
9  ... 
10 } 
(gdb) record function-call-history /ilc 
1 bar  inst 1,4  at foo.c:6,8 
2 foo inst 5,10 at foo.c:2,3 
3 bar  inst 11,13 at foo.c:9,10 

आप को चलाने के लिए की जरूरत है:

start 
record btrace 

जो है, जहां एक गैर सक्षम सीपीयू के साथ विफल रहता है:

Target does not support branch tracing. 

सीपीयू समर्थन पर आगे चर्चा की गई है: How to run record instruction-history and function-call-history in GDB?

संबंधित धागे:

एम्बेडेड के लिए, आप भी JTAG और एआरएम के DSTREAM तरह समर्थन हार्डवेयर, लेकिन 86 समर्थन पर विचार बहुत अच्छा नहीं लगता है: debugging x86 kernel using a hardware debugger

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

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