麒麟系统未生成core dump需依次解除ulimit -c限制、配置kernel.core_pattern至可写目录(权限1777)、启用suid_dumpable=2,并用segv.c验证;否则gdb无法调试崩溃现场。

麒麟操作系统发生段错误或进程崩溃时,若未生成核心转储文件(core dump),就无法用GDB分析崩溃现场。这通常是因为系统默认禁用该功能,或关键配置项被限制为0。
检查并解除shell级大小限制
第一步:运行
第二步:执行
第三步:永久生效需编辑/etc/security/limits.conf,在文件末尾添加两行:
* soft core unlimited
* hard core unlimited
保存后需【重新登录用户会话】才能加载新限制。
配置内核core_pattern路径与命名规则
方法一:直接写入procfs(立即生效,重启失效)
执行sudo sysctl -w kernel.core_pattern=/var/crash/core.%e.%p.%t,将转储文件定向到/var/crash/目录,并按程序名、PID、时间戳自动命名。
方法二:持久化配置(推荐)
编辑/etc/sysctl.conf,追加一行:
kernel.core_pattern = /var/crash/core.%e.%p.%t
再运行sudo sysctl -p加载。
创建目标目录并赋权:
sudo mkdir -p /var/crash && sudo chmod 1777 /var/crash
其中1777确保所有用户可写但仅属主可删——【若权限不是1777,普通用户进程崩溃时会因无写入权限而静默失败】。
启用setuid程序的core dump支持
以root权限运行的程序(如sudo调用的二进制)默认禁止生成core文件,需调整内核安全参数。
执行echo 2 | sudo tee /proc/sys/fs/suid_dumpable,将值设为2表示允许完整dump。
为避免重启后失效,向/etc/sysctl.conf追加fs.suid_dumpable = 2,再运行sudo sysctl -p加载。
验证core dump是否真正触发
① 编写测试程序segv.c:
int main() { char *p = NULL; return *p; }
② 编译:gcc -g -o segv segv.c
③ 运行:./segv,终端应立即输出Segmentation fault (core dumped)
④ 检查生成结果:ls -l /var/crash/core.*,确认有匹配文件出现。











