【发布时间】:2020-01-15 13:34:30
【问题描述】:
我尝试在 Linux 上调试一个 x86_64 汇编程序,但是当我尝试使用 gdb 时,它会随机跳过并循环执行相同的一对指令或重复指令。它似乎还根据我设置断点的位置循环不同的指令。
我尝试在网上研究这个问题,当编译器过于积极地优化并生成错误的调试信息时,我看到很多人在使用 C++ 时遇到了同样的问题。我没有看到任何关于组装的信息,但我相信yasm 也可能是这里的问题。
这是我的 Makefile。
myprog : myprog.o
gcc -static -fdwarf2-cfi-asm myprog.o -o myprog
myprog.o : myprog.asm
yasm -f elf64 -g dwarf2 myprog.asm -o myprog.o
请注意,我正在静态链接,因为我无法让动态链接正常工作。我以后可能会就此提出一个单独的问题。
这或多或少是gdb 会话的样子。
...
(gdb)@ n
65 call findrepl
(gdb)@ n
73 mov rdi, str3
(gdb)@ n
75 call findrepl
(gdb)@ n
75 call findrepl
(gdb)@ n
65 call findrepl
...
使用s、si 或ni 都与上面显示的n 相同。我以前的汇编程序没有这个问题。有时gdb 会说我执行了类似xor eax, eax 的操作,但随后会显示我对printf 的调用的输出。
我对汇编编程和gdb 比较陌生,所以在我的脑海里,我想知道这是否是我的错。有没有办法来解决这个问题?我也想知道是否有任何解决方法,因为如果不使用gdb,我似乎无法调试它。
【问题讨论】:
-
一个 YASM 源代码行对应 0 或 1 个 asm 指令。 (宏除外)。一个 C/C++ 源代码行可能对应于许多 非连续 asm 指令。 “跳过”效果与 C/C++ 编译器完全无关,在 C/C++ 编译器中存在如何发出调试信息的真正问题。 (例如,在 godbolt.org 上编译一些复杂的东西,并注意源代码行 asm 指令颜色编码是不平凡的,除非您禁用优化)。甚至 YASM 宏也会产生连续的 asm 指令块。
-
我没有遇到 YASM
-gdwarf2的问题,只有 NASM-g -Fdwarf有时会中断objdump -d。我与ld或gcc链接,但我不使用任何额外的GCC 选项,如-fdwarf2-cfi-asm。虽然-f选项是代码生成的,所以在不将 C 转换为 asm 时可能没有效果,只是链接。 -
我实际上不知道为什么我一直在使用
-fdwarf2-cfi-asm。我想我是在遇到链接问题时开始使用它的,它神奇地使一些错误消息消失了。我依稀记得在另一篇 Stack Overflow 帖子中阅读并尝试过。不过,我认为你是对的,它没有任何作用。
标签: linux assembly gdb x86-64 yasm