查看程序集和C代码

Tec*_*ndz 38 gdb

我们有办法使用gdb查看程序集和c代码.

disassemble function_name只显示程序集,我试图找到一种方法来将map c代码放到程序集中.谢谢

sir*_*rge 47

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

gdb -tui <your-binary>
(gdb) b main
(gdb) r
(gdb) layout split
Run Code Online (Sandbox Code Playgroud)

layout split命令将窗口分为两部分 - 其中一部分显示源代码,另一部分显示相应的程序集.其他一些技巧:

  • 设置反汇编风味的英特尔 - 如果您更喜欢英特尔符号
  • set print asm-demangle - 在汇编视图中demangles C++名称
  • ni - 下一条指令
  • si - step指令

如果您不想使用TUI模式(例如您的终端不喜欢它),您可以随时执行:

x /12i $pc
Run Code Online (Sandbox Code Playgroud)

这意味着从当前程序计数器地址打印12条指令 - 这也适用于上面的技巧(解码,步进指令等).

"x/12i $ pc"技巧在gdb和cgdb中都有效,而"layout split"仅适用于gdb.

请享用 :)

  • @BabkenVardanyan尝试`布局下一个`.如果它没有为您提供所需的布局,请再次尝试此命令.此命令在布局之间保持切换,以便您可以保留所需的布局. (3认同)

Yor*_*war 31

试试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)
Run Code Online (Sandbox Code Playgroud)

  • 我不想要其他解决方案,因为我不想重新启动gdb并再次以相同的方式设置它.并且.o文件对重定位部分的引用使其难以理解.所以我觉得这只是门票.想象一下,当我最终意识到反汇编/ m默默地省略了一些指令时,比如在第一个三字节指令之后:`0x000000000442f038 <+24>:mov%rsi,%rbx 0x000000000442f043 <+35>:sub $ 0x38 ,%rsp`这是`GNU gdb(GDB)7.4.1-debian`. (3认同)
  • gdb 文档不鼓励 `/m` 并建议使用 `/s`:“/m 选项已被弃用,因为当存在内联代码或重新排序的代码时,其输出没有用。/s 选项是首选。这是 AMD x86-64 的一个示例,显示了 /m 输出和 /s 输出之间的差异。该示例在头文件中定义了一个内联函数,并且代码是使用“-O2”优化编译的。请注意 /m 的输出方式输出缺少 /s 输出中存在的几条指令的反汇编。” -- https://sourceware.org/gdb/current/onlinedocs/gdb/Machine-Code.html (3认同)

小智 6

为了您的目的,请尝试

objdump -S <your_object_file>
Run Code Online (Sandbox Code Playgroud)

来自man objdump:

-S
--source
 Display source code intermixed with disassembly, if possible.
 Implies -d.
Run Code Online (Sandbox Code Playgroud)