核心文件格式
用途
包含进程出错时的映像。
描述
发生各种错误时,将在当前目录中创建 .core 文件。 诸如内存地址违例,非法指令,总线错误和用户生成的退出信号之类的错误通常会导致此 核心转储。 所创建的 核心 文件包含已终止的进程的内存映像。 如果发生故障的进程是多线程的,并且当前 核心 大小 乌勒明 小于转储数据部分所需的大小,那么仅从数据部分转储故障线程堆栈区域。
该进程分配的任何共享内存也可以从核心文件中选择省略。 仅当导出 CORE_NOSHM 环境变量时,才会省略此数据。 缺省值是将所有共享内存包括在核心文件中。 可以将 CORE_NOSHM 变量设置为任何值。
仅当导出环境变量 CORE_NAMING 时,才会启用唯一核心文件命名。 与先前发行版一样,缺省名称为 core 。 变量的值应设置为 true。
核心转储的内容按顺序组织在 核心 文件中,如下所示:
| 项 | 描述 |
|---|---|
| 核心头 | 定义有关核心转储的基本信息,并包含用于查找核心转储信息的剩余部分的偏移量。 |
| 林福 结构 | 定义装入程序信息。 |
| 姆斯特斯保存 结构 | 定义内核线程状态信息。 由于故障线程 姆斯特斯保存 结构直接保存在核心头中,因此仅对于多线程程序,会在此处保存其他结构。 |
| 缺省用户堆栈 | 在核心转储时包含用户堆栈的副本。 |
| 缺省数据区 | (可选) 包含用户数据部分。 |
| 内存映射区域 | (可选) 包含匿名映射的区域。 |
| vm_info 结构 | (可选) 包含内存映射区域的偏移量和大小信息。 |
缺省情况下,用户数据是匿名映射的区域,并且 vm_info 结构未包含在核心转储中。 此部分核心转储包含当前进程堆栈,线程堆栈,线程 姆斯特斯保存 结构,用户结构以及故障发生时寄存器的状态。 部分核心转储包含用于堆栈回溯的足够信息。 核心转储的大小也可能受到 塞特尔林特 子例程的限制。
要启用完整核心转储,请在 签名 子例程中为要生成完整核心转储的信号设置 SA_FULLDUMP 标志。 如果在转储核心时设置此标志,那么数据部分将以匿名方式映射区域,并且 vm_info 结构将包含在核心转储中。
通过以下方式转储核心文件:
- 所有转储核心都位于正在运行的进程的上下文中。 将使用与进程的有效用户标识 (UID) 和组标识 (GID) 匹配的所有者和组来转储这些文件。 如果此 UID/GID 对无权写入到根据标准核心路径过程确定的目标目录,那么不会转储任何核心文件。
- 如果真实用户标识 (RUID) 是 root 用户,那么可以始终转储核心文件,但方式为 0600。
- 如果有效用户标识 (EUID) 与实际用户标识 (RUID) 匹配,并且有效组标识 (EGID) 与凭证的组列表中的任何组匹配,那么将以许可权 0600 转储核心文件。
- 如果 EUID 与 RUID 匹配,但 EGID 与凭证的组列表中的任何组都不匹配,那么无法转储核心文件。 有效用户无法看到他们无法访问的数据。
- 如果 EUID 与 RUID 不匹配,那么仅当您已使用 系统路径 命令设置了核心目录时,才能转储核心文件。 这样可以避免以无法除去核心文件的方式将核心文件转储到当前工作目录或特定于用户的核心目录中。 核心以 0600 方式进行转储。 如果您尚未使用 系统路径 命令来设置核心目录,那么不会转储任何核心。
核心头的格式由 core_dump 结构 (在 core.h 头文件中) 定义,其组织方式如下:
| 项 | 字段名称 | 描述 |
|---|---|---|
| char | 科西尼奥 | 导致此错误的信号的编号。 |
| char | c_Flag | 描述核心转储类型的位字段。 这些位的含义如下所示:
|
| ushort | 个条目 | 核心转储模块数 |
| 结构体 ld_info * | 卡选项卡 | 核心表开头处的偏移量 |
| 卡德拉特 | c_堆栈 | 用户堆栈的开头的偏移量 |
| 整数 | c_size | 用户堆栈的大小。 |
| 结构体 mstsave | 克姆斯特 | 发生故障的 mst 的副本 |
| 结构用户 | 中国 | 用户结构的一个副本 |
| 整数 | 恩姆斯斯 | 由以下项引用的 姆斯特斯保存 结构数:c_msts字段 |
| struct mstsave * | 科姆斯 | 其他线程的 姆斯特斯保存 结构的偏移量 |
| 整数 | 数据大小 | 这是数据区域的大小 |
| 卡德拉特 | 数据 | 用户数据的偏移量 |
| 整数 | c_虚拟机区域 | 匿名映射的区域的数量 |
| 结构体 vm_info * | c_vmm | 相对于 vm_info 表开头的偏移量 |