
ubuntu coredump 环境配置操作指南1. 概述本文档说明如何配置 Linux coredump 环境用于捕获程序崩溃时的核心转储文件便于使用 gdb 进行问题定位。coredump 是程序崩溃时的内存快照包含崩溃时的寄存器状态、堆栈信息等对于分析引擎崩溃问题至关重要。2. 配置步骤2.1 基础环境检查# 检查当前coredump配置cat/proc/sys/kernel/core_patternulimit-c2.2 方法一systemd-coredump推荐2.2.1 安装 systemd-coredumpsudoapt-getupdatesudoapt-getinstall-ysystemd-coredump2.2.2 配置文件systemd coredump 配置/etc/systemd/coredump.conf:[Coredump] Storageexternal MaxSize50G KeepFree10G ProcessSizeMax100G Compressyes2.2.3 内核 core_pattern 配置# 临时设置重启失效sudosysctl-wkernel.core_pattern|/lib/systemd/system/systemd-coredump%i.service# 持久化配置echokernel.core_pattern|/lib/systemd/system/systemd-coredump%i.service|\sudotee/etc/sysctl.d/99-coredump.conf2.2.4 启用服务# 启用socketsocket-activated方式按需启动sudosystemctlenablesystemd-coredump.socketsudosystemctl start systemd-coredump.socket2.2.5 设置进程资源限制# 临时设置当前会话ulimit-cunlimited# 持久化设置echo* soft core unlimited|sudotee/etc/security/limits.d/coredump.confecho* hard core unlimited|sudotee-a/etc/security/limits.d/coredump.conf2.3 方法二文件模式简单测试用文件模式更简单可靠适合快速验证和内网服务器。# 设置core文件输出到指定目录sudosysctl-wkernel.core_pattern/tmp/core.%e.%p.%t# 创建目录并设置权限sudomkdir-p/tmpsudochmod1777/tmp# 设置文件大小限制ulimit-cunlimited文件名格式说明格式符说明%e可执行文件名%p进程PID%t时间戳秒%u用户UID%g用户GID%h主机名3. Docker 容器内 coredump 配置引擎运行在 Docker 容器内时需要额外配置3.1 容器启动参数sudodockerrun-it--privileged\--ulimitcoreunlimited\--cap-addSYS_ADMIN\--cap-addPERFMON\--networkhost\...其他参数... easzlab.io.local:5000/lyserver-builder:2.3 /bin/bash关键参数说明--ulimit coreunlimited: 允许容器生成任意大小的core文件--privileged: 获取完整系统权限性能分析需要--cap-addSYS_ADMIN: 系统管理能力用于性能分析工具3.2 宿主机捕获容器内进程崩溃时core文件会写入宿主机被内核的 core_pattern 捕获。确保宿主机已完成上述配置。4. 验证配置4.1 编写测试程序创建/tmp/test_crash.c:#includestdio.h#includestdlib.h#includeunistd.h#includestring.hvoidtrigger_null_pointer_crash(){int*ptrNULL;printf(About to dereference NULL pointer...\n);*ptr42;// SIGSEGV here}intmain(intargc,char*argv[]){printf( Coredump Test \n);printf(PID: %d\n,getpid());if(argc1strcmp(argv[1],null)0){trigger_null_pointer_crash();}return0;}4.2 编译和测试# 编译带调试符号cd/tmp gcc-g-O0-otest_crash test_crash.c# 设置ulimitulimit-cunlimited# 触发崩溃./test_crash null4.3 验证结果方法一systemd-coredump:# 查看所有coredump记录coredumpctl list# 查看最新coredump详情coredumpctl info# 使用gdb分析coredumpctl debugPID方法二文件模式:# 检查core文件ls-la/tmp/core.*# 使用gdb分析gdb /tmp/test_crash /tmp/core.test_crash.12345.1234567890(gdb)bt5. 使用 gdb 分析 core 文件5.1 加载 core 文件# 方法1直接加载gdb /path/to/executable /path/to/corefile# 方法2在gdb内加载gdb(gdb)file/path/to/executable(gdb)core-file /path/to/corefile5.2 常用调试命令命令简写说明backtracebt显示调用堆栈backtrace fullbt full显示完整堆栈包含局部变量frame Nf N切换到第N个栈帧info locals显示当前栈帧的局部变量info args显示当前函数参数print varp var打印变量值x/64x addr十六进制查看内存5.3 分析示例(gdb) bt #0 0x00005c8d1e9671f0 in trigger_null_pointer_crash () at test_crash.c:10 10 *ptr 42; // SIGSEGV here #1 0x00005c8d1e9673ee in main (argc2, argv0x7ffd2bc83f88) at test_crash.c:47崩溃定位结果崩溃发生在trigger_null_pointer_crash()函数文件test_crash.c第10行代码为*ptr 42;空指针解引用由main()函数在第47行调用6. 加载调试符号如果 gdb 显示[unknown]而非函数名需要加载调试符号# 在gdb内设置符号路径(gdb)symbol-file /path/to/library.with.debug# 或者加载可执行文件和符号(gdb)file/path/to/executable(gdb)add-symbol-file /path/to/library.debug 0x...# 查看是否加载成功(gdb)info sharedlibrary7. 多线程程序分析如果是多线程程序崩溃# 查看所有线程(gdb)info threads# 切换到指定线程(gdb)thread N# 查看所有线程堆栈(gdb)thread apply all bt8. 常见问题8.1 core_pattern 配置正确但无 core 文件检查资源限制ulimit-c# 如果显示0需要设置为 unlimitedulimit-cunlimited8.2 core 文件过大被截断在/etc/systemd/coredump.conf中增加限制MaxSize100G8.3 gdb 显示 [unknown]需要加载对应的调试符号文件.debug 或带调试信息的库文件。8.4 程序启动时设置了 setrlimit如果程序内部调用setrlimit(RLIMIT_CORE, ...)禁用了core需要在代码中移除或修改。9. coredumpctl 命令参考# 列出所有coredumpcoredumpctl list# 显示coredump信息coredumpctl info[PID]# 调试coredumpcoredumpctl debug[PID]# 删除coredumpcoredumpctl delete[PID]# 清空所有coredumpcoredumpctl purge# 后台转储用于大文件coredumpctl dump PIDcore.file10. 快速参考# 一行命令验证配置文件模式ulimit-cunlimited(echoint main(){int*p0;*p1;}|gcc-xc --o/tmp/t/tmp/t)# 清理测试文件rm-f/tmp/test_crash /tmp/test_crash.c /tmp/core.*11. 安全注意事项权限控制: core文件可能包含敏感信息密码、密钥等确保目录权限正确磁盘空间: 大型程序的core文件可能很大几十GB确保有足够空间自动清理: 设置合理的MaxSize和KeepFree避免磁盘耗尽调试完成后删除: 使用完core文件后及时清理