2012-04-02 76 views
32

我们是否有办法使用gdb查看汇编和c代码。查看汇编和C代码

反汇编function_name只显示程序集,我试图找到一种方法来easliy将c代码映射到程序集。 由于

回答

40

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

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

layout split命令将所述窗口成两个部分 - 它们中的一个显示所述源代码,另外一个的相应的组装。 一些其他技巧:

  • 集拆卸味英特尔 - 如果你喜欢英特尔符号
  • 集打印ASM-还原函数 - 在装配图demangles C++的名字
  • - 未来指令
  • si - 步指令

如果您不想使用TUI模式(例如,终端不喜欢它),你总是可以做:

x /12i $pc 

这意味着打印12个从当前程序计数器地址指令 - 这也适用于上述的技巧(demangling,步进指令等)。

“x/12i $ pc”技巧适用于gdb和cgdb,而“布局拆分”只适用于gdb。

享受:)

+0

有什么办法也摆脱顶部拆分窗口的?这是无意义的,需要空间。 – 2014-02-01 17:05:46

+2

@BabkenVardanyan尝试'下一个布局'。如果它没有给你所需的布局,请尝试多次这个命令。这个命令不断在布局之间切换,所以你可以保留你想要的。 – 2015-05-16 14:45:52

17

尝试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) 
+0

我并不想要其他解决方案,因为我不想重新启动gdb并让它再次以相同方式设置,并且.o文件对重定位部分的引用使其很难理解。所以我认为这只是票。想象一下,我的恐惧,那么,当我最终意识到拆机/平方米默默省略了一些指令,像第一,三个字节指令后: '0x000000000442f038 <+24>:\t MOV%RSI,%RBX 0x000000000442f043 <+35>:\t子$ 0x38, %rsp' 这就是'GNU gdb(GDB)7.4.1-debian'。 – 2017-10-23 18:40:02

3

你的目的,尽量

objdump -S <your_object_file> 

从人objdump的:

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