【问题标题】:Why is yasm generating incorrect debugging information?为什么 yasm 会生成错误的调试信息?
【发布时间】: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
...

使用ssini 都与上面显示的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。我与ldgcc 链接,但我不使用任何额外的GCC 选项,如-fdwarf2-cfi-asm。虽然-f 选项是代码生成的,所以在不将 C 转换为 asm 时可能没有效果,只是链接。
  • 我实际上不知道为什么我一直在使用-fdwarf2-cfi-asm。我想我是在遇到链接问题时开始使用它的,它神奇地使一些错误消息消失了。我依稀记得在另一篇 Stack Overflow 帖子中阅读并尝试过。不过,我认为你是对的,它没有任何作用。

标签: linux assembly gdb x86-64 yasm


【解决方案1】:

经过反复试验,我发现了 gdb 的“-tui”选项和“layout asm”命令。可能有更好的方法可以做到这一点,但基本上是你输入的内容:

[user@comp ~/prog/]$ gdb -tui myprog
(gdb)@ layout asm
(gdb)@ break main
(gdb)@ run

然后你就可以疯狂了。默认情况下,它被反汇编为 AT&T 表示法。您可以使用show disassembly-flavor 检查当前显示的符号。您可以使用set disassembly-flavor intelset disassembly-flavor att 进行更改。

如需更多信息,请在gdb 中运行help tuihelp layouthelp set disassembly-flavor

【讨论】:

  • layout asm 或(我对调试 asm 的偏好)layout reg 即使您没有在 TUI 模式下启动 GDB,也可以正常工作。他们进入 TUI 模式;你可以离开tui disab。另见底部stackoverflow.com/tags/x86/info
猜你喜欢
  • 2021-09-18
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多