为什么 yasm 生成不正确的调试信息?

Why is yasm generating incorrect debugging information?

我有一个 x86_64 汇编程序,我试图在 Linux 上调试,但是当我尝试使用 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 session 的样子。

...
(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.

的情况下对其进行调试

经过反复试验,我发现了 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 更改它。

有关详细信息,运行 help tuihelp layouthelp set disassembly-flavor gdb