2009-10-18 49 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