我已经使用yasm进行代码汇编,并链接到我的C ++程序,但是我无法在汇编语言文件中的符号上设置gdb中的断点。
命令行可能并不是很有启发性,但我们走了:
"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文件中的任何函数上添加断点。例如,我在那里有一个名为MandelRect的函数。这里的gdb向我展示了它在哪里,在main的某个地方:
(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告诉我它的地址是什么:
(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
如果我在正确的地址放置一个断点,当执行到达函数时,我无法通过指令逐步执行它。它只是从标签到标签,尽我所能(被打扰)告诉。
显然 - 好吧,也许吧? - 这与gdb坚持在没有调试的情况下编译文件有关。但是在相关的.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
被打破了吗?有没有人设法让yasm的调试信息与gdb一起工作?
(系统为Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u3 x86_64 GNU/Linux
。)
答案 0 :(得分:2)
我的程序包含.text
部分之外的代码,因为我以某种方式设法拼错了#34; text&#34;在asm文件中(您可以在上面的objdump输出中看到)。 yasm允许你根据自己的喜好命名你的部分,显然它们最终被标记为可执行,但很明显很多工具都不期待这个......
这也解决了我从perf
得到的一些奇怪的结果。