Linux怎么开启核心转储_Linux core dump生成与调试配置【开发】

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_pidcat /proc/sys/kernel/suid_dumpable,确认输出为 12

四、通过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-reloadsudo 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 查看回溯信息。