Ubuntu 22.04:如何将核心转储文件存至可执行文件同目录
在Ubuntu 22.04中将核心转储文件保存到可执行文件所在目录
步骤1:替换内核core_pattern,绕过systemd-coredump
当前你的/proc/sys/kernel/core_pattern指向systemd-coredump服务,需要替换为自定义处理脚本:
- 临时生效(重启后失效):
sudo sysctl -w kernel.core_pattern="|/usr/local/bin/core_handler.sh %p %e"
- 永久生效:编辑
/etc/sysctl.conf,添加或修改以下内容:
kernel.core_pattern=|/usr/local/bin/core_handler.sh %p %e
执行sudo sysctl -p使设置立即生效。
步骤2:编写自定义核心转储处理脚本
创建/usr/local/bin/core_handler.sh脚本,内容如下:
#!/bin/bash # 接收内核传递的参数:%p为崩溃进程ID,%e为可执行文件名 PID=$1 EXE_NAME=$2 # 获取可执行文件的绝对路径及所在目录 EXE_PATH=$(readlink -f /proc/$PID/exe) EXE_DIR=$(dirname "$EXE_PATH") # 定义核心转储文件名格式 CORE_FILE="$EXE_DIR/core-${EXE_NAME}-${PID}" # 从标准输入读取内核输出的核心转储数据,写入目标文件 cat > "$CORE_FILE" # 设置文件权限,确保原进程所有者可访问 chown $(ps -o user= -p $PID):$(ps -o group= -p $PID) "$CORE_FILE" chmod 600 "$CORE_FILE"
步骤3:给脚本添加执行权限
sudo chmod +x /usr/local/bin/core_handler.sh
步骤4:调整核心转储大小限制
- 临时生效(当前会话):
ulimit -c unlimited
- 永久生效(全局用户):编辑
/etc/security/limits.conf,添加:
* soft core unlimited * hard core unlimited
重启系统或重新登录后生效。
步骤5:验证设置
编译并运行一个触发崩溃的测试程序:
#include <iostream> int main() { int* null_ptr = nullptr; *null_ptr = 10; // 触发段错误 return 0; }
编译运行命令:
g++ -o crash_test crash_test.cpp ./crash_test
检查当前目录下是否生成了core-crash_test-<进程ID>格式的核心转储文件。
注意事项
- 若程序以root身份运行,需确保脚本有权限写入对应目录,必要时调整脚本中的权限逻辑。
- 若遇到AppArmor拦截问题,可临时关闭服务测试:
sudo systemctl stop apparmor,确认后再配置AppArmor规则允许脚本操作。
内容的提问来源于stack exchange,提问作者Venelin
相关产品推荐
相关产品推荐

