为什么 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
...
使用 s
、si
或 ni
都与上面显示的 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 intel
或 set disassembly-flavor att
更改它。
有关详细信息,运行 help tui
、help layout
或 help set disassembly-flavor
gdb
。
我有一个 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
...
使用 s
、si
或 ni
都与上面显示的 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 intel
或 set disassembly-flavor att
更改它。
有关详细信息,运行 help tui
、help layout
或 help set disassembly-flavor
gdb
。