Linux 中的核心转储文件是啥?它提供啥信息?

Posted

技术标签:

【中文标题】Linux 中的核心转储文件是啥?它提供啥信息?【英文标题】:What is a core dump file in Linux? What information does it provide?Linux 中的核心转储文件是什么?它提供什么信息? 【发布时间】:2011-03-16 05:46:50 【问题描述】:

什么是 linux 中的核心转储文件?它提供了哪些信息?

【问题讨论】:

信息代码转储文件链接linux.die.net/man/5/core 你看不懂en.wikipedia.org/wiki/Core_dump吗? @Gabe - 也许他们可以,但so what?. @detly 仅仅因为某些内容发布到 MetaSO 并不意味着它是正确的。事实上,这是非常错误的,原因有两个:1)如果 SO 所有编程问题答案的最终来源,那么与其在谷歌上查找,不如看看他们。 询问,而不是查找,是一种更耗时且效率更低的获取信息的方式。 2) SO 不是所有编程信息的最终来源,永远不会是那个来源,并且为此类信息提供单一来源的整个想法是愚蠢的。 @Jim Balter,@Gabe - 很公平,我没有看到这一点并站得住脚。尽管如此,将@paxdiablo 的答案(简单、连贯、有针对性且包含示例)与***条目进行比较:“使用...”部分的一半以上过于笼统或适用于过时的技术,它与历史和格式,总共有三句话专门解决这里的实际问题(Linux 上的核心转储)。这里的答案是比上面提供的任何一个外部链接更好的起点。 【参考方案1】:

它基本上是正在使用的进程地址空间(来自包含所有虚拟内存区域的mm_struct 结构),以及崩溃时的任何其他支持信息*a

例如,假设您尝试取消引用 NULL 指针并接收 SEGV 信号,导致您退出。作为该过程的一部分,操作系统会尝试将您的信息写入文件以供日后进行事后分析。

您可以将核心文件与可执行文件(例如,用于符号和其他调试信息)一起加载到调试器中,然后四处寻找导致问题的原因。


*a:在内核版本 2.6.38 中,fs/exec.c/do_coredump() 负责核心转储,您可以看到它传递了信号号、退出代码和寄存器。它依次将信号编号和寄存器传递给特定于二进制格式(ELF、a.out 等)的转储器。

ELF转储器是fs/binfmt_elf.c/elf_core_dump(),你可以看到它在fs/binfmt_elf.c/fill_note_info()中输出了非基于内存的信息,比如线程细节,然后返回输出进程空间。

【讨论】:

核心文件中会提供全局变量信息吗? @Jay:变量本身会在那里,因为它们在地址空间中。关于它们的信息(例如将名称映射到位置)不是。这是加载到调试器时从可执行文件中检索到的内容(假设可执行文件是使用调试信息编译的)。 @Jay 局部变量的值也会在里面,通过可执行文件中的符号表让调试器知道如何访问它们,如果可执行文件有调试符号表,比如由 gcc -g 创建。 (对于其他编译器,请查看他们的文档。) 对我来说,地址空间是一组地址。我认为说核心文件是崩溃时进程内存的转储会更准确。 @Ben,澄清说地址空间正在使用中。【参考方案2】:

如果程序异常终止,应记录程序在异常终止点的状态,以便进一步分析。并且这个状态记录在核心转储文件中。

在多用户和多任务环境中,访问不属于您的资源是不可接受的。如果进程-A 试图访问属于进程-B 的系统资源,则属于违规行为。此时,操作系统会杀死进程并将进程状态存储到文件中。这个文件称为核心转储文件。核心转储的原因有很多。我刚刚解释了核心转储的一种可能性。通常是因为 SIGSEGV (segmentation fault) 和 SIGBUS(Bus error)。

核心转储文件包含异常终止发生位置、进程堆栈、符号表等的详细信息。

有许多工具可用于调试核心转储。 数据库 数据库 对象转储 数据库

提供编译器选项以简化调试过程。而编译给出这些标志(通常是-g)将导致在目标文件的符号表中留下额外的信息,这有助于调试器(gdb/dbx)轻松访问符号(符号引用)。

【讨论】:

以上是关于Linux 中的核心转储文件是啥?它提供啥信息?的主要内容,如果未能解决你的问题,请参考以下文章

linux系统核心日志路径以及记录的是啥内容?

linux内核转储 - 这是啥时候发生的?

这个 Windows 故障转储是啥意思?

在Linux机器上运行C代码时出现分段错误(核心转储)[关闭]

Android操作系统是基于Linux Kernel是啥意思

究竟啥是核心文件,它为啥有用?