在x86上使用GDB而不调试符号?

时间:2008-11-26 20:11:52

标签: debugging gdb breakpoints symbols

如何使用GDB调试32位x86处理器上没有调试符号的程序?检查函数参数,局部变量,解析指针对知道如何操作很有用。 目的并不是将它用于逆向工程,因为我有时懒得安装调试符号,并且很高兴知道如何从gdb中获取一些基本信息。

4 个答案:

答案 0 :(得分:22)

首先,你可以这样做;

gdb "whatever"
break __libc_start_main
r

将在libc的crt0代码中设置一个断点,并允许你在main之前断开,即使目标二进制文件被完全剥离。

这将使您在大多数用户代码之前到达断点处的运行状态。然后你可以单步,消解,转储等等......直到你的内心。

这适用于所有平台,您询问IA-32 / x86无关紧要。

答案 1 :(得分:7)

如果没有调试符号,则只能在ASM级别进行调试。好的,您可以获得更多信息,但除非您了解一些ASM和编译器生成的代码,否则您不会走得太远。这将让你对局部变量等进行简单的检查如果你知道你在做什么。

如果你有源代码,那么重新编译它会容易得多。

答案 2 :(得分:1)

所有你能做的就是查看寄存器和堆栈的内容 - 你必须通过推断用于什么东西来做所有事情,正如Draemon所提到的那样。

答案 3 :(得分:0)

嗯,最重要的是你能够解开堆栈。有三种方法可以确保:

  • 使用-g

  • 构建调试符号
  • 在通过表进行C ++异常展开的系统上(现在可能是ELF的任何东西?),-funwind-tables标志将告诉它生成这样的表而不管语言如何,GDB可以使用这些表(在至少,使用x86 linux它可以)。

  • 或者,如果失败,至少要确保-fomit-frame-pointer未启用