2010-08-30 11 views
6

मेरे पास निम्न प्रश्न है और सिस्टम परिप्रेक्ष्य से यह जानना है कि यह आसानी से और कुशलता से कैसे प्राप्त किया जाए।सी/सी ++ ट्रेस-प्रोग्रामिंग तकनीकों के बारे में प्रश्न

डीबग जानकारी और एक वैश्विक चर "ट्रैस" के साथ बनाया गया एक कार्य 'एबीसी' दिया गया है जो आमतौर पर 0 पर सेट होता है, मैं प्रत्येक फ़ंक्शन के पते को 'लॉग' फ़ाइल करने के लिए प्रिंट करना चाहता हूं उस समय के बीच जब TRACE को 1 पर सेट किया गया है और 0 से वापस 0

मैं इसे सामने वाले लोडिंग/बूट-स्ट्रैपिंग कार्य के माध्यम से ऐसा करने पर विचार कर रहा था जिसे मैं विकसित करना चाहता हूं जो कूदने के सामान्य पैटर्न के लिए निर्देशों को देखता है/फ्रेम पॉइंटर पुश, पता लिखना और फिर abc में प्रतीकात्मक डीबग जानकारी से फ़ंक्शन नामों के लिए पते मैप करना। हालांकि फ्रंट-लोडर के बिना ऐसा करने के लिए बेहतर सिस्टम स्तर के तरीके हो सकते हैं, और मुझे यकीन नहीं है कि सबसे व्यवहार्य क्या है।

वहां कोई भी लागू तकनीकें हैं?

+3

Profilers पहले से ही है कि आप के लिए क्या कर सकते हैं। वे आपके लिए क्यों काम नहीं करते? – Dummy00001

+0

आप इसके नाम के बजाय फ़ंक्शन के पते में रुचि क्यों रखते हैं? यह भी जानना उपयोगी है कि आप किस ओएस और कंपाइलर का उपयोग कर रहे हैं। –

+0

मैं एचपी/सन/आईबीएम पर जीसीसी/सीसी/एक्सएलसी का उपयोग कर रहा हूं। मैं अंततः कार्यों के नाम पर रूचि रखता हूं; पता केवल एक मध्यवर्ती के रूप में किया गया था और अनावश्यक हो सकता है। धन्यवाद। – BlueCollar

उत्तर

1

सुनिश्चित करें कि आपने __func__ या __FUNCTION__ पूर्वनिर्धारित पहचानकर्ताओं को देखा है। वे फ़ंक्शन/विधि नाम का एक स्ट्रिंग अक्षर प्रदान करते हैं जिसे आप वर्तमान में निष्पादित कर रहे हैं।

3

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

आप कुछ प्रोफाइलिंग टूल भी देख सकते हैं। उनमें से कुछ के पास कार्यक्षमता है जो आप मांग रहे हैं। उदाहरण के लिए, कुछ समय-समय पर संपूर्ण कॉलस्टैक का नमूना लेंगे, जो वास्तव में प्रत्येक कॉल को लॉग इन किए बिना कोड प्रवाह के बारे में बहुत कुछ बता सकता है।

+0

प्रीप्रोकैसिंग स्रोत इसे करने के सबसे सस्ता तरीकों में से एक हो सकता है। – Dummy00001

+0

हमें हर कॉल लॉग इन करने की आवश्यकता है। मैं उच्च आवृत्ति आवधिक ढेर पाने के लिए dtrace का उपयोग कर सकता था, लेकिन यह चाल करने वाला नहीं है।प्रीप्रोकैसिंग स्रोत हो सकते हैं, लेकिन हमारी बाइनरी पहले ही 32-बिट 4 गीग सीमा तक पहुंच रही है। धन्यवाद – BlueCollar

2

एक सामान्य प्रस्तावना/epilogue की तलाश फ्रेम-सूचक चूक और पूंछ कॉल अनुकूलन की उपस्थिति में काम नहीं करेगा। इसके अलावा, आधुनिक अनुकूलक कई कार्यों में कार्यों को विभाजित करना और विभिन्न कार्यों के सामान्य पूंछ के टुकड़ों को मर्ज करना चाहते हैं।

कोई मानक समाधान नहीं है।

माइक्रोसॉफ्ट कंपाइलर के लिए, _penter और _pexit हुक देखें। जीसीसी के लिए, -finstrument-functions विकल्प और दोस्तों को देखें।

इसके अलावा, x86 विंडोज पर आप WinApiOverride32 जैसे मॉनिटर का उपयोग कर सकते हैं। यह मुख्य रूप से डीएलएल और सिस्टम एपीआई कॉल की निगरानी के लिए है, लेकिन आप अपने एप्लिकेशन की मैप फ़ाइल से एक विवरण फ़ाइल जेनरेट कर सकते हैं और आंतरिक कार्यों की निगरानी भी कर सकते हैं।

: - यहां तक ​​कि दिखा पते के बजाय समारोह का नाम (। संपादित जीसीसी विकल्प को जोड़ा गया लिंक)

+0

मैं सहमत हूं - प्रतिक्रिया के लिए धन्यवाद। ऐसा लगता है कि डीबगर 'डीबीएक्स' ऐसा करने में सक्षम है, इसलिए मुझे नहीं लगता कि पूंछ कॉल अनुकूलन है - या डीबीएक्स इसे कैसे समझ सकता है? यदि डीबगर ऐसा कर सकता है, तो हमें सक्षम होना चाहिए। समस्या यह है कि यह उत्पादन वातावरण में डीबीएक्स में लोड होने के लिए व्यावहारिक रूप से व्यावहारिक नहीं है, इसलिए विचार एक समान फ्रंट लोडिंग कार्य में आवश्यक न्यूनतम कार्य करना था जो कह सकता है कि जब द्विआधारी कार्य करने के लिए बुला रहे हैं। यहां तक ​​कि सबसे बुरी स्थिति परिदृश्य में भी मैं सभी कूदों को रिकॉर्ड कर सकता हूं, जो इंट्रा-फ़ंक्शन प्रवाह (हालांकि शोर के बावजूद) दिखाएगा। – BlueCollar

+0

मैं -फिनस्ट्रुमेंट-फ़ंक्शंस के लिए आशा करता हूं :) आगे की जांच करेगा .. बहुत धन्यवाद – BlueCollar

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

  • कोई संबंधित समस्या नहीं^_^