2012-02-23 13 views
14

मेरे पास एक C++ ऑब्जेक्ट फ़ाइल है जिसमें कुछ C++ टेम्पलेट फ़ंक्शंस के तत्काल हैं। प्रश्न में ऑब्जेक्ट फ़ाइल टेम्पलेट पैरामीटर के कुछ अलग संयोजनों के लिए एक ही फ़ंक्शन को तुरंत चालू करती है। मैं एक समस्या को डीबग करने की कोशिश कर रहा हूं और टेम्पलेट फ़ंक्शन के विशिष्ट तत्कालता के डिस्सेप्लर को देखना चाहता हूं (यानी, मैं उस फ़ंक्शन के लिए टेम्पलेट पैरामीटर जानता हूं जिसे मैं जांचना चाहता हूं)। ऑब्जेक्ट फ़ाइल को अलग करने के लिए मैं आमतौर पर objdump का उपयोग करके ऐसा करता हूं, लेकिन यह (कम से कम डिफ़ॉल्ट रूप से) C++ फ़ंक्शन नामों को डी-मैंगल करने में सक्षम नहीं है। क्या इसे करने का कोई तरीका है? ऑब्जेक्ट फ़ाइलें जीसीसी 4.6.1 का उपयोग करके बनाई गई थीं।सी ++ टेम्पलेट कार्यों के un-mangle नाम objdump कर सकते हैं?

उत्तर

13

इसे c++filt के माध्यम से पाइप करें? इसे -n देने के लिए आवश्यक है कि क्या प्रतीक अग्रणी अंडरस्कोर w/या w/o आते हैं या नहीं।

+4

ऐसा लगता है कि यह काम करेगा। मुझे अभी भी 'objdump' के लिए' -C' विकल्प मिला, जो कम से कम मेरे आवेदन के लिए काम करता प्रतीत होता है। –

+0

@ जेसनआर भी बेहतर है। ऐतिहासिक रूप से 'एनएम ++' जैसे विकल्प और संस्करण नाम रहे हैं लेकिन वे हिट और मिस थे और मुझे बस सब कुछ पाइप करने की आदत मिली। – smparkes

+0

@ जेसनआर, इसे पोस्ट करने के लिए धन्यवाद ... '-C'' objdump' के मेरे संस्करण में अनियंत्रित किया गया था ('--help' के साथ नहीं दिखाया गया) लेकिन यह अभी भी काम करता है। –

8

objdump -C जैसा कि टिप्पणी में Jason R द्वारा उल्लेख किया गया है।

man objdump का कहना है:

डिकोड (demangle) उपयोगकर्ता के स्तर के नाम में निम्न स्तर के प्रतीक नाम। सिस्टम द्वारा प्रीपेड किए गए किसी भी प्रारंभिक अंडरस्कोर को हटाने के अलावा, यह सी ++ फ़ंक्शन नामों को पठनीय बनाता है। विभिन्न कंपाइलर्स में अलग-अलग मैंगलिंग शैलियों हैं। वैकल्पिक demangling शैली तर्क का उपयोग आपके कंपाइलर के लिए उचित demangling शैली का चयन करने के लिए किया जा सकता है। पर एक operator new[] और objdump -CSr मंगलाचरण पर

नमूना उत्पादन:

char *sn = new char[4]; 
10: bf 04 00 00 00   mov $0x4,%edi 
15: e8 00 00 00 00   callq 1a <main+0x1a> 
         16: R_X86_64_PC32  operator new[](unsigned long)-0x4 

-C के बिना यह घायल नाम _Znam दिखा सकती है।

nm में यह विकल्प भी है।