在Linux和Mac OS XI中,可以使用stepi和nexti来调试应用程序而无需调试信息.
在Mac OS X上,gdb显示了在库中调用的函数,尽管有时会在每个stepi指令中推进几个汇编器指令.
在Linux上,当我进入动态库时,gdb会丢失.例如,使用puts()在puts()中有三个汇编指令,一旦gdb到达0x080482bf的跳转,它就会失败并显示消息"No function contains program for selected frame".
0x080482ba in puts@plt () (gdb) disassemble Dump of assembler code for function puts@plt: 0x080482b4: jmp *0x8049580 0x080482ba : push $0x10 0x080482bf : jmp 0x8048284 <_init+48> End of assembler dump. (gdb) stepi 0x080482bf in puts@plt () (gdb) stepi 0x08048284 in ?? () (gdb) disassemble No function contains program counter for selected frame.
你知道如何使用gdb调试这些库调用.
如果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 0x721f100x0070c735 <_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
,这使我可以进入标准库中的功能.