【发布时间】:2012-04-02 03:41:28
【问题描述】:
我们有办法使用 gdb 查看汇编和 c 代码吗?
disassemble function_name 仅显示程序集,我试图找到一种将 c 代码轻松映射到程序集的方法。 谢谢
【问题讨论】:
标签: gdb
我们有办法使用 gdb 查看汇编和 c 代码吗?
disassemble function_name 仅显示程序集,我试图找到一种将 c 代码轻松映射到程序集的方法。 谢谢
【问题讨论】:
标签: gdb
您可以在 文本用户界面 (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,而“布局拆分”仅适用于 gdb。
享受:)
【讨论】:
layout next。如果它没有为您提供所需的布局,请再尝试几次此命令。此命令不断在布局之间切换,因此您可以保留所需的布局。
layout regs中的寄存器?
试试disassemble /m。
参考http://sourceware.org/gdb/current/onlinedocs/gdb/Machine-Code.html#Machine-Code
格式与objdump -S类似,源码与反汇编混用。示例输出摘录:
10 int i = 0;
=> 0x0000000000400536 <+9>: movl $0x0,-0x14(%rbp)
11 while (1) {
12 i++;
0x000000000040053d <+16>: addl $0x1,-0x14(%rbp)
【讨论】:
GNU gdb (GDB) 7.4.1-debian。
/m,而是建议/s:“/m 选项已弃用,因为当存在内联代码或重新排序的代码时,它的输出无用。/s选项是首选。这里是 AMD x86-64 的示例,显示 /m 输出和 /s 输出之间的区别。该示例在头文件中定义了一个内联函数,并且代码使用“-O2”优化编译. 请注意 /m 输出如何缺少 /s 输出中存在的几条指令的反汇编。” -- sourceware.org/gdb/current/onlinedocs/gdb/Machine-Code.html
为了你的目的,试试
objdump -S <your_object_file>
来自人 objdump:
-S
--source
Display source code intermixed with disassembly, if possible.
Implies -d.
【讨论】:
最快的方法是在启动gdb后按下组合键ctrl-x 2。
这将立即为您提供一个拆分窗口,其中包含文本用户界面模式下的源代码和程序集(在接受的答案中描述)。
另一个工具提示:此模式下的键盘箭头用于在源代码中上下导航,要使用它们访问命令历史记录,您可以使用ctrl-x o,它将重新聚焦在 gdb shell 窗口上。
【讨论】: