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

Unix 是否可以调试由无gdb标志编译的可执行文件生成的核心文件?,unix,coredump,Unix,Coredump,是否可以调试由无gdb标志编译的可执行文件生成的核心文件 如果是,是否有任何指针或教程?如果程序在编译时没有-g标志,则无法调试核心文件 否则,您可以这样做: gdb可执行核心文件 更多信息,请访问: 是的,你可以。但这并不容易。我给你举个例子 假设我有一个名为foo.c的程序: 我将编译它并确保没有符号: $ cc foo.c $ strip a.out $ file a.out a.out: ELF 32-bit LSB executable, Intel 80386, version 1

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


如果是,是否有任何指针或教程?

如果程序在编译时没有-g标志,则无法调试核心文件

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

更多信息,请访问:
是的,你可以。但这并不容易。我给你举个例子

假设我有一个名为foo.c的程序:

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

$ 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)
哎呀。好像有个虫子。让我们启动一个调试器:

$ 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反向工程”提供了一些可能有用的链接

更新:

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

我建议不要剥离,甚至不要给出源代码。我写的所有代码都会和源代码一起提供给客户。我曾多次站在客户一边,面对一个不称职的供应商,该供应商运送了一个坏的软件,但不知道如何修复它。真糟糕

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

这里还有一些附加信息。

是的,你可以, 这就是写裂缝的人正在做的事, 不幸的是,我再也没有大学里学过的课程的幻灯片和文档了,但通过谷歌搜索
逆向工程
反汇编教程
可以为你提供一些起点。此外,了解汇编代码的使用方法也很重要

我们的课程是以一本书为基础的,主要是第一章和第三章,但现在有一本新版本

计算机系统:R.E.Bryant和D.R.O'Hallaron的程序员视角

它解释了计算机系统背后的基础知识,也让你对系统中程序的运行有了很好的了解


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

您所指的gdb标志是什么?您的意思是-g标志(调试标志)吗?正如您的一个好答案所示,汇编级调试就是您所能得到的全部。这是可以做到的,但并不容易,也不会有“教程”。您必须学习运行程序的处理器的汇编语言。了解操作系统、CPU体系结构和对象文件格式可能会有帮助,使这成为一个更明智的问题。您能提供这些信息吗?如果您不选择答案,将为您选择一个答案。:-)所以,在大多数客户场景中,他们的可执行文件都是在没有gdbflag-g的情况下编译的,对吗?那么,我们如何调试在客户场景中生成的核心转储呢?根据客户场景,我认为您谈论的是发布的build或exe。因此,根据我的经验,在这种情况下,核心转储无法进行调试。您可以等待更好的答案,这样我也可以从中受益:)根据我的经验,发布版本仍然是使用-g构建的(即使使用了优化,比如-O3)。这确保了一些可调试性。可执行文件被复制到存档中。然后,这些符号从可执行文件(包括库)中剥离出来,然后这些文件也被归档。最后,无符号版本发布到野外。然后,您可以告诉gdb将可执行文件设置为可调试的可执行文件,同时使用带剥离符号的可执行文件中的核心文件。然后GDB很高兴,一切都“正常”(就像调试一个优化的可执行文件“正常”)。
(gdb) p $eax
$1 = 0
(gdb)