Linux系统中未生成core dump文件时,需依次检查并配置ulimit限制、/proc/sys/kernel/core_pattern、core_uses_pid与suid_dumpable参数、systemd服务限制,并通过崩溃测试程序验证。

如果您在Linux系统中运行程序时发生崩溃,但未生成core dump文件,则可能是由于核心转储功能被禁用或相关配置不正确。以下是开启并正确配置Linux核心转储的步骤:
一、检查并设置ulimit限制
Linux默认可能将core文件大小限制为0,导致崩溃时不生成任何转储文件。需通过ulimit命令临时或永久调整该限制。
1、在当前终端中执行 ulimit -c unlimited,允许生成任意大小的core文件。
2、验证设置是否生效:执行 ulimit -c,输出应为 unlimited 而非 0。
3、若需永久生效,将 ulimit -c unlimited 添加至用户shell配置文件(如 ~/.bashrc 或 ~/.profile)末尾,并执行 source ~/.bashrc。
二、配置/proc/sys/kernel/core_pattern
该内核参数决定core文件的命名规则与保存路径。默认情况下core文件可能仅生成为“core”,且位于进程工作目录,易被覆盖或难以定位。
1、查看当前模式:执行 cat /proc/sys/kernel/core_pattern。
2、临时设置为带时间戳和PID的格式:执行 echo '/tmp/core.%e.%p.%t' | sudo tee /proc/sys/kernel/core_pattern。
3、确保目标目录存在且可写:执行 sudo mkdir -p /tmp/coredumps && sudo chmod 1777 /tmp/coredumps。
三、启用kernel.core_uses_pid与kernel.suid_dumpable
这两个内核参数分别控制是否在core文件名中包含PID,以及是否允许对setuid程序生成core dump。部分安全策略会禁用后者,导致特权程序崩溃时不生成转储。
1、启用PID后缀:执行 echo 1 | sudo tee /proc/sys/kernel/core_uses_pid。
2、允许setuid程序生成core:执行 echo 2 | sudo tee /proc/sys/kernel/suid_dumpable(值2表示在满足dumpable标志时允许)。
3、验证变更:分别执行 cat /proc/sys/kernel/core_uses_pid 和 cat /proc/sys/kernel/suid_dumpable,确认输出为 1 和 2。
四、通过systemd服务配置core dump(适用于systemd系统)
对于由systemd管理的服务,其资源限制独立于用户shell,需通过systemd单位文件显式启用core dump。
1、编辑对应服务的覆盖配置:执行 sudo systemctl edit servicename.service(将servicename替换为实际服务名)。
2、在打开的编辑器中添加以下内容:
[Service]
LimitCORE=infinity
MemoryLimit=infinity
3、重载配置并重启服务:执行 sudo systemctl daemon-reload 和 sudo systemctl restart servicename.service。
五、验证core dump是否正常生成
生成一个故意崩溃的测试程序,用于确认整个配置链路有效。此步骤可快速识别前序配置中是否存在遗漏或冲突。
1、创建测试C文件 crash.c:内容为 int main() { char *p = NULL; return *p; }。
2、编译:执行 gcc -g -o crash crash.c。
3、运行并触发段错误:执行 ./crash,随后检查 ls -l /tmp/core.* 是否出现新生成的core文件。
4、使用gdb加载验证:执行 gdb ./crash /tmp/core.crash.*,进入后输入 bt 查看回溯信息。









