是否可以调试由没有gdb标志编译的可执行文件生成的核心文件?

时间:2011-08-02 08:13:49

标签: unix coredump

是否可以调试由没有gdb标志编译的可执行文件生成的核心文件?

如果是,可以使用任何指针或教程吗?

3 个答案:

答案 0 :(得分:15)

是的,你可以。但这并不容易。我会举个例子。

假设我有以下程序名为 foo.c

main()
{
    *((char *) 0) = '\0';
}

我会编译它并确保没有符号:

$ cc foo.c
$ strip a.out
$ file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped

好的,是时候运行它了:

$ ./a.out
Segmentation fault (core dumped)

糟糕。似乎有一个bug。让我们启动一个调试器:

$ gdb ./a.out core
[..]
Reading symbols from /tmp/a.out...(no debugging symbols found)...done.
[..]
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0  0x0804839c in ?? ()
(gdb) bt
#0  0x0804839c in ?? ()
#1  0xb7724e37 in __libc_start_main () from /lib/i386-linux-gnu/libc.so.6
#2  0x08048301 in ?? ()
嗯,看起来很糟糕。没有符号。我们能弄明白发生了什么吗?

(gdb) x/i $eip
=> 0x804839c:   movb   $0x0,(%eax)

看起来它试图将一个值为零的字节存储到EAX寄存器指向的内存位置。为什么会失败?

(gdb) p $eax
$1 = 0
(gdb)

失败是因为EAX寄存器指向内存地址为零,并且它试图在该地址存储一个字节。糟糕!

不幸的是,我没有指向任何好教程的指针。搜索“gdb逆向工程”会给出一些可能有用的部分链接。

<强>更新

我注意到这是关于调试客户的核心转储的评论。将剥离的二进制文件发送给客户时,应始终保留该二进制文件的调试版本。

我建议不要剥离甚至提供源代码。我写的所有代码都带有源代码的客户。我一直在客户方面面对一个不称职的供应商,该供应商已经发布了一个破碎的软件,但不知道如何解决它。很糟糕。

这似乎实际上是这个问题的重复:

Debug core file with no symbols

还有一些额外的信息。

答案 1 :(得分:2)

是的,你可以, 这就是那些写破解的人正在做的事情, 不幸的是,我没有大学后面的课程的幻灯片和文件,但谷歌搜索reverse engineeringdisassembly tutorials会给你一些起点。了解汇编代码的方法也很重要。

我们班的课程主要基于第1章和第1章。 3但现在有一个新版本

Computer Systems: A programmer's perspective by R.E. Bryant and D.R. O'Hallaron

解释了计算机系统背后的基础知识,同时也为您提供了系统中程序工作的良好知识。

同样在学习时,请注意64位cpus的汇编代码与32位cpu不同,以防万一。

答案 2 :(得分:-2)

如果程序是在没有-g标志的情况下编译的,则无法调试核心文件。

否则你可以这样做: gdb可执行核心文件

您可以在以下位置找到更多信息: http://wwwpub.zih.tu-dresden.de/~mlieber/practical_debugging/04_gdb.pdf