2009-10-18 176 views
10

我可以使用stepi和nexti在不調試信息的情況下調試應用程序。在Linux和Mac OS X中使用gdb調試反彙編庫

在Mac OS X上gdb顯示庫中調用的函數,雖然有時會在每個stepi指令中推進幾個彙編指令。

在Linux上,當我進入動態庫時,gdb會丟失。例如,對於puts(),在puts()中有三個彙編程序指令,一旦gdb在0x080482bf處跳轉,它將失敗並顯示消息「無功能包含選定幀的程序計數器」。

0x080482ba in [email protected]() 
(gdb) disassemble 
Dump of assembler code for function [email protected]: 
0x080482b4 <[email protected]+0>:  jmp *0x8049580 
0x080482ba <[email protected]+6>:  push $0x10 
0x080482bf <[email protected]+11>:  jmp 0x8048284 <_init+48> 
End of assembler dump. 
(gdb) stepi 
0x080482bf in [email protected]() 
(gdb) stepi 
0x08048284 in ??() 
(gdb) disassemble 
No function contains program counter for selected frame. 

你知道如何用gdb調試這些庫調用。

+0

哪個版本的gdb? – 2009-10-22 19:57:59

+0

另外,當您在Linux上使用stepi時會發生什麼?你說你根本無法完成指示,但你沒有描述實際發生的情況。你可以發佈一個示例會議嗎? – 2009-10-22 20:03:57

+0

謝謝,我使用的是預裝gdb 6.8的Slackware 13.0。 我已澄清發生了什麼。 – Freeman 2009-10-24 08:21:32

回答

12

如果GDB沒有您要調試的函數的調試符號,GDB將無法確定要反彙編的內存地址範圍。要解決此問題,您可以將範圍傳遞給disassemble命令。例如:

(gdb) p $pc 
$4 = (void (*)()) 0x70c72d <_IO_puts+29> 
(gdb) disassemble 0x70c72d 0x70c740 
Dump of assembler code from 0x70c72d to 0x70c740: 
0x0070c72d <_IO_puts+29>: mov %eax,(%esp) 
0x0070c730 <_IO_puts+32>: call 0x721f10 <strlen> 
0x0070c735 <_IO_puts+37>: mov 0x84c(%ebx),%edx 
0x0070c73b <_IO_puts+43>: cmpw $0x0,(%edx) 
0x0070c73f <_IO_puts+47>: mov %edx,-0x10(%ebp) 
End of assembler dump. 

可能有安裝調試符號的方法。在我的Ubuntu系統上,我安裝了包libc6-dbg,這使我可以進入標準庫中的功能。

+3

GNU gdb(GDB)7.4.1-debian。現在正確的語法是「反彙編0x70c72d,0x70c740」。那就是必須有逗號。 – golem 2015-08-21 20:39:36