gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:20:49 27 4
gpt4 key购买 nike

我有一个 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 更改它。

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

关于linux - 为什么 yasm 生成不正确的调试信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57927620/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com