c++ हरण मैं कैसे जावास्क्रिप्ट का उपयोग करके कोड को डीबग करने के लिए gdb का उपयोग कर सकता हूं?



व्हाट इस जावास्क्रिप्ट (1)

मेरे प्रोग्राम में कोड है जो .text खंड के बाहर था, क्योंकि मैं किसी तरह एएसएम फ़ाइल में "पाठ" को गलत तरीके से चला रहा था (जैसा कि आप ऊपर objdump के आउटपुट में देख सकते हैं)। yasm आपको अपने अनुभागों को आपकी पसंद के रूप में नाम दे देता है, और जाहिर है कि उन्हें निष्पादन योग्य के रूप में चिह्नित किया जाता है, लेकिन स्पष्ट रूप से कई उपकरण इस की अपेक्षा नहीं कर रहे हैं ...

यह भी कुछ अजीब परिणाम तय किया था मैं भी perf से मिल रहा था, भी।

मेरे पास कोड कोडिंग है, और मेरे सी ++ प्रोग्राम में जोड़ने के लिए, लेकिन मैं असेंबली भाषा फ़ाइल से प्रतीकों पर जीडीबी में ब्रेकपॉइंट सेट नहीं कर सकता।

कमांड लाइन शायद बहुत रोशनी नहीं कर रहे हैं, लेकिन यहां हम जा रहे हैं:

"g++"  -ftemplate-depth-128 -O0 -fno-inline -Wall -g -fPIC -std=c++11   -I"$HOME/usr/include" -c -o "bin/gcc-4.7/debug/main.o" "main.cpp"
yasm -g dwarf2 -f elf64 -o bin/gcc-4.7/debug/mandel.o mandel.yasm
"g++" -L"$HOME/usr/lib" -Wl,-R -Wl,"$HOME/usr/lib" -Wl,-rpath-link -Wl,"$HOME/usr/lib" -o "bin/gcc-4.7/debug/mandel" -Wl,--start-group "bin/gcc-4.7/debug/main.o" "bin/gcc-4.7/debug/mandel.o"  -Wl,-Bstatic  -Wl,-Bdynamic -lboost_system -lboost_thread -Wl,--end-group -g 

यह सब घटना के बिना बनाता है, और कार्यक्रम रन। लेकिन जब मैं इसे डीबग करने के लिए gdb में लोड करने की कोशिश करता हूं, तो मुझे लगता है कि yasm फ़ाइल में किसी भी फ़ंक्शन पर ब्रेकपॉइंट नहीं लगाए जा सकते हैं। उदाहरण के लिए, वहां मेन्डेलरेक्ट नामक एक फ़ंक्शन है I यहां जीडीबी मुझे दिखा रहा है कि वह कहां से कहता है, कहीं मुख्य में:

(gdb) disassemble 0x404ada,0x404af0
Dump of assembler code from 0x404ada to 0x404af0:
   0x0000000000404ada <main()+474>:     mov    %rax,%rdi
   0x0000000000404add <main()+477>:     callq  0x409980 <MandelRect>
   0x0000000000404ae2 <main()+482>:     movq   $0x0,-0x18(%rbp)
   0x0000000000404aea <main()+490>:     jmp    0x404b1c <main()+540>
   0x0000000000404aec <main()+492>:     mov    -0x18(%rbp),%rdx
End of assembler dump.

जीडीबी मुझे बता रहा है कि इसका पता क्या है:

(gdb) info address MandelRect
Symbol "MandelRect" is at 0x409980 in a file compiled without debugging.

यहां gdb उस पर एक ब्रेकपॉइंट रखने में असमर्थ रहा है:

(gdb) break MandelRect
Function "MandelRect" not defined.
Make breakpoint pending on future shared library load? (y or [n]) n

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

जाहिर है - शायद, हो सकता है? - इसमें जीडीबी के आग्रह के साथ ऐसा कुछ है जो फ़ाइल डिबगिंग के बिना संकलित की गई थी। लेकिन प्रासंगिक .o फ़ाइल में और बाइनरी में प्रतीकों में प्रतीत होते हैं:

~/tests/mandel/bin/gcc-4.7/debug% nm mandel.o | grep MandelRectAsm
0000000000000000 R MandelRectAsm
~/tests/mandel/bin/gcc-4.7/debug% nm mandel | grep MandelRectAsm 
000000000040a340 R MandelRectAsm
~/tests/mandel/bin/gcc-4.7/debug% objdump -t mandel.o | grep -i MandelRectAsm
0000000000000000 g       .txt   0000000000000000 MandelRectAsm
~/tests/mandel/bin/gcc-4.7/debug% objdump -t mandel | grep -i MandelRectAsm
000000000040a340 g       .txt   0000000000000000              MandelRectAsm

तो मैं यह कैसे ठीक करूं? क्या मैंने कुछ गलत समझा है, या क्या yasm -g टूट गया है? क्या किसी ने कभी जीएसबी के साथ काम करने के लिए यूज की डीबग जानकारी हासिल करने में कामयाबी हासिल की है?

(सिस्टम Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u3 x86_64 GNU/Linux ।)





yasm