【问题标题】:Debugging disassembled libraries with gdb使用 gdb 调试反汇编的库
【发布时间】:2010-12-07 19:17:59
【问题描述】:

在 Linux 和 Mac OS X 中,我可以使用 stepi 和 nexti 来调试应用程序而无需调试信息。

在 Mac OS X 上,gdb 显示在库中调用的函数,尽管有时会在每个 stepi 指令中推进几条汇编指令。

在 Linux 上,当我进入动态库时,gdb 会丢失。例如,对于 puts(),puts() 中有三个汇编指令,一旦 gdb 在 0x080482bf 处跳转,它就会失败并显示消息“No function contains program counter for selected frame”。

0x080482ba in puts@plt ()
(gdb) disassemble
Dump of assembler code for function puts@plt:
0x080482b4 <puts@plt+0>:        jmp    *0x8049580
0x080482ba <puts@plt+6>:        push   $0x10
0x080482bf <puts@plt+11>:       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 调试这些库调用吗?

【问题讨论】:

  • 另外,在 Linux 上使用 stepi 会发生什么?您说您根本无法逐步执行说明,但您没有描述实际发生的情况。你能发布一个示例会话吗?
  • 谢谢,我使用的是 Slackware 13.0,它预装了 gdb 6.8。我已经澄清了会发生什么。

标签: assembly x86 gdb disassembly


【解决方案1】:

如果 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,它允许我单步执行标准库中的函数。

【讨论】:

  • GNU gdb (GDB) 7.4.1-debian。现在正确的语法是disassemble 0x70c72d, 0x70c740。那就是必须有逗号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
  • 2017-09-21
相关资源
最近更新 更多