查看汇编和C代码

49

我们有没有一种方式可以使用gdb同时查看汇编和C代码。

disassemble函数名称仅显示汇编代码,我正在尝试找到一种将C代码映射到汇编代码的简单方法。 谢谢

4个回答

66

你可以在 文本用户界面 (TUI) 模式下运行 gdb:

gdb -tui <your-binary>
(gdb) b main
(gdb) r
(gdb) layout split

layout split 命令可以将窗口分成两个部分 - 一个显示源代码,另一个显示相应的汇编代码。 一些其他的技巧:

  • set disassembly-flavor intel - 如果你喜欢英特尔符号
  • set print asm-demangle - 在汇编视图中解析 C++ 名称
  • ni - 下一条指令
  • si - 步进执行指令

如果您不想使用 TUI 模式(例如,您的终端不支持它),您总是可以进行以下操作:

x /12i $pc

这意味着从当前程序计数器地址打印12条指令——这也适用于上面介绍的技巧(解缠、单步执行指令等)。

"x /12i $pc" 这个技巧在 gdb 和 cgdb 中都有效,而 "layout split" 只在 gdb 中有效。

享受吧 :)


有没有办法也摆脱顶部分割窗口?它是不必要的,占用空间。 - Babken Vardanyan
5
尝试使用“layout next”指令。如果未得到所需的布局,请多尝试几次此指令。该指令会不断切换布局,以便您可以保留所需的布局。 - A. K.
有没有办法像“layout regs”一样查看寄存器? - Ciro Santilli OurBigBook.com

44

4
我不想选择其他的解决方案,因为我不想重新启动GDB并再次设置它,而且“.o”文件对重定位部分的引用使得它很难理解。所以我认为这只是合适的方法。但是,我很震惊,最终意识到反汇编/m静默地省略了一些指令,比如第一个三字节指令之后: “GNU gdb (GDB) 7.4.1-debian”。 - Martin Dorey
3
gdb文档不鼓励使用/m,而是建议使用/s:“由于存在内联代码或重新排序的代码时,/m选项的输出并不有用,因此该选项已被弃用。/s选项是首选。这里是一个AMD x86-64的示例,显示了/m输出和/s输出之间的差异。此示例在头文件中定义了一个内联函数,并使用“-O2”优化编译代码。请注意,/m输出缺少几个指令的反汇编,而这些指令在/s输出中存在。” -- https://sourceware.org/gdb/current/onlinedocs/gdb/Machine-Code.html - thakis

9

针对您的目的,请尝试:

objdump -S <your_object_file>

来自 man objdump:

-S
--source
 Display source code intermixed with disassembly, if possible.
 Implies -d.

2
最快的方法是在启动gdb后按下键盘组合键ctrl-x 2
这将立即在文本用户界面模式下给您一个分割窗口,其中包含源代码和汇编代码(在接受的答案中有描述)。
还有一个小提示:在此模式下使用键盘箭头可以上下导航源代码,若要使用它们访问命令历史记录,您可以使用ctrl-x o来重新聚焦gdb shell窗口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接