当前位置:  开发笔记 > 运维 > 正文

使用gdb调试反汇编的库

如何解决《使用gdb调试反汇编的库》经验,为你挑选了1个好方法。

在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调试这些库调用.



1> mpontillo..:

如果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 
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,这使我可以进入标准库中的功能.


GNU gdb(GDB)7.4.1-debian.现在正确的语法是`disassemble 0x70c72d,0x70c740`.那就是必须有逗号.
推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有