2012-04-02 70 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.