2015-04-12 4 views
5

मैं एक कोर डंप का निरीक्षण कर रहा हूँ और प्रतीकों समारोह तर्क मान मुद्रित करने के लिए की जरूरत है जब केवल अपने प्रकार के लिए जाना जाता है (कोई तर्क नाम प्रतीक) कैसे समारोह तर्क मान मुद्रित करने के लिए:GDB: जब कोई नाम उपलब्ध

(gdb) frame 7 
#7 0x00007f201a269e82 in f1(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char*, int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)() from /usr/lib64/libsome.so 
(gdb) info args 
No symbol table info available. 
(gdb) info f 
Stack level 7, frame at 0x7f200ebf9e50: 
rip = 0x7f201a269e82 
    in f1(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char*, int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >*); saved rip 0x7f201b430905 
called by frame at 0x7f200ebfa1c0, caller of frame at 0x7f200ebf9e00 
Arglist at 0x7f200ebf9df8, args: 
Locals at 0x7f200ebf9df8, Previous frame's sp is 0x7f200ebf9e50 
Saved registers: 
    rbx at 0x7f200ebf9e28, rbp at 0x7f200ebf9e30, r12 at 0x7f200ebf9e38, r13 at 0x7f200ebf9e40, rip at 0x7f200ebf9e48 

विशेष रूप से, मुझे यह जानने की ज़रूरत है कि पहले तर्क (std :: string) में क्या है और अंतिम एक (std :: string *) में क्या है। arglist और स्थानीय लोगों इस फ्रेम में एक ही पते पर दोनों बिंदु में ...

+0

इस फ़ंक्शन को अलग करने का प्रयास करें। हो सकता है कि आपको फ़ंक्शन तर्कों के बारे में कुछ जानकारी मिल जाएगी। –

उत्तर

4

यह करने के लिए कोई आसान तरीका नहीं है।

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

बेशक, अगर आपके पास डीबगिनफ़ो नहीं है तो कास्टिंग भी मुश्किल हो सकती है। यद्यपि एक चाल है: -g के साथ एक डमी फ़ाइल संकलित करें जिसमें आपके पास आवश्यक प्रकार हैं और फिर symbol-file इसे प्रकार तक पहुंच प्राप्त करने के लिए gdb में शामिल करें। बेशक इसमें चेतावनी है, आपको सही कंपाइलर और लाइब्रेरी संस्करणों का उपयोग करना है, सही कंपाइलर लक्ष्य और एबीआई-बदलते झंडे इत्यादि का उपयोग करना है।

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

इसके अलावा, यह ध्यान देने योग्य है कि gdb frame आउटपुट लंबे समय तक चलने वाले दिनों के बाद बहुत कुछ नहीं बदला है। मुझे लगता है कि "arglist" और "स्थानीय" जानकारी वास्तव में डीडब्ल्यूएआरएफ और आधुनिक एबीआई के साथ व्यर्थ है। इसे ठीक करने के बारे में एक जीडीबी बग खुला है।