我们有没有一种方式可以使用gdb同时查看汇编和C代码。
disassemble函数名称仅显示汇编代码,我正在尝试找到一种将C代码映射到汇编代码的简单方法。 谢谢
我们有没有一种方式可以使用gdb同时查看汇编和C代码。
disassemble函数名称仅显示汇编代码,我正在尝试找到一种将C代码映射到汇编代码的简单方法。 谢谢
你可以在 文本用户界面 (TUI) 模式下运行 gdb:
gdb -tui <your-binary>
(gdb) b main
(gdb) r
(gdb) layout split
layout split
命令可以将窗口分成两个部分 - 一个显示源代码,另一个显示相应的汇编代码。
一些其他的技巧:
如果您不想使用 TUI 模式(例如,您的终端不支持它),您总是可以进行以下操作:
x /12i $pc
这意味着从当前程序计数器地址打印12条指令——这也适用于上面介绍的技巧(解缠、单步执行指令等)。
"x /12i $pc" 这个技巧在 gdb 和 cgdb 中都有效,而 "layout split" 只在 gdb 中有效。
享受吧 :)
disassemble /m
命令。objdump -S
,并将源码与反汇编混合在一起。以下是示例输出摘录:10 int i = 0;
=> 0x0000000000400536 <+9>: movl $0x0,-0x14(%rbp)
11 while (1) {
12 i++;
0x000000000040053d <+16>: addl $0x1,-0x14(%rbp)
/m
,而是建议使用/s
:“由于存在内联代码或重新排序的代码时,/m
选项的输出并不有用,因此该选项已被弃用。/s
选项是首选。这里是一个AMD x86-64的示例,显示了/m输出和/s输出之间的差异。此示例在头文件中定义了一个内联函数,并使用“-O2”优化编译代码。请注意,/m输出缺少几个指令的反汇编,而这些指令在/s输出中存在。” -- https://sourceware.org/gdb/current/onlinedocs/gdb/Machine-Code.html - thakis针对您的目的,请尝试:
objdump -S <your_object_file>
来自 man objdump:
-S
--source
Display source code intermixed with disassembly, if possible.
Implies -d.
ctrl-x 2
。ctrl-x o
来重新聚焦gdb shell窗口。