GDB 问题 - 我如何逐行查看反汇编代码?

Posted

技术标签:

【中文标题】GDB 问题 - 我如何逐行查看反汇编代码?【英文标题】:GDB question - how do I go through disassembled code line by line? 【发布时间】:2010-05-04 01:10:26 【问题描述】:

我想逐行查看老师给我的二进制文件,以检查堆栈上的地址和不同寄存器的内容,但我对使用 gdb 不是非常熟悉。虽然我有 C 代码,但我们应该完全从二进制文件中工作。以下是我目前使用的命令:

(gdb) file SomeCode

这给了我这个信息:

Reading symbols from ../overflow/SomeCode ...(no debugging symbols found)...done.

然后我使用:

(gdb) disas main

这给了我所有的程序集。我想设置一个断点并使用“下一个”命令,但我尝试过的命令都不起作用。有谁知道我会使用的语法吗?

【问题讨论】:

【参考方案1】:

尝试使用ni,即nexti。等价于si,这是一步指令

【讨论】:

当我在“file SomeCode”命令之后或“disas main”之后尝试 ni、next、step 等时,它说“程序没有运行”。如果我尝试执行“运行 ./SomeCode”,则会显示权限被拒绝。知道我错过了什么吗? @user 首先设置断点,运行,下一个:break mainrunstepi。阅读手册,它解释得很好。我并不是要让你失望,手册确实是学习调试的绝佳来源。另外,您可以使用帮助命令,例如help break @user 如果你还在苦苦挣扎,请发布你的命令,我会指出你犯错的地方。 我从 C 文件重新编译,现在似乎可以工作了。我认为我的老师给我的二进制文件不是用 -g 开关编译的。不过感谢您的帮助【参考方案2】:

nexti 如果你想跳过函数调用。 stepi 如果你想输入一个函数调用。

以下文档非常有帮助;它列出了您可以在 gdb 上使用的所有重要命令。

X86-64:http://csapp.cs.cmu.edu/public/docs/gdbnotes-x86-64.pdf

IA32:http://csapp.cs.cmu.edu/public/docs/gdbnotes-ia32.pdf

【讨论】:

以上是关于GDB 问题 - 我如何逐行查看反汇编代码?的主要内容,如果未能解决你的问题,请参考以下文章

GDB 反汇编使用不一致的寄存器命名

反汇编区段加密代码

反汇编正在运行的内核

gdb 反汇编:以 16 为基数显示函数偏移量

[GDB]设置gdb反汇编语法为intel

在 LLDB 中将反汇编风格设置为 Intel