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 是所有编程它基本上是正在使用的进程地址空间(来自包含所有虚拟内存区域的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机器上运行C代码时出现分段错误(核心转储)[关闭]