You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:50:25