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

如何在GNU/Linux中为核心转储指定文件名与存储目录?

在应用内指定核心转储的名称与存储位置

完全可以在应用内实现,无需修改全局系统配置,以下是两种可靠的方案:

方案一:使用prctl()系统调用(推荐)

Linux内核2.6.19及以上版本支持通过prctl()的PR_SET_CORE_DUMP_NAME选项,为当前进程指定核心转储的路径和命名规则。这个设置是进程级别的,只会影响当前应用,不会改动系统全局配置。

代码示例

在应用初始化阶段(比如main()函数开头)添加以下代码:

#include <sys/prctl.h>
#include <sys/resource.h>
#include <stdio.h>

int main() {
    // 确保核心转储大小限制已开启
    struct rlimit rlim;
    rlim.rlim_cur = RLIM_INFINITY;
    rlim.rlim_max = RLIM_INFINITY;
    if (setrlimit(RLIMIT_CORE, &rlim) != 0) {
        perror("setrlimit failed");
        return 1;
    }

    // 指定核心转储文件路径与名称,支持占位符
    const char* core_path = "/opt/myapp/coredumps/myapp-%p-%t.core";
    if (prctl(PR_SET_CORE_DUMP_NAME, core_path) != 0) {
        perror("prctl set core dump name failed");
        return 1;
    }

    // 后续应用逻辑...
    return 0;
}

占位符说明

路径中可以使用以下占位符生成唯一文件名:

  • %p:进程ID(PID)
  • %t:转储时间戳(秒级)
  • %u:进程所属用户ID(UID)
  • %g:进程所属组ID(GID)

注意事项

  1. 确保指定的目录(比如/opt/myapp/coredumps)已存在,且当前进程有写入权限,否则核心转储会失败。
  2. PR_SET_CORE_DUMP_NAME要求路径是绝对路径,不能用相对路径。
  3. 若内核版本低于2.6.19,此方法不可用,可改用方案二。

方案二:捕获崩溃信号并主动生成核心转储

如果系统内核版本较低,无法使用prctl(),可以通过捕获SIGSEGV、SIGABRT等崩溃信号,在信号处理函数中调用gcore命令生成指定路径的核心文件。

代码示例

#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>

void crash_handler(int sig) {
    char cmd[256];
    // 生成包含PID的核心文件名,存储到指定目录
    snprintf(cmd, sizeof(cmd), "gcore -o /opt/myapp/coredumps/myapp-%p.core %d", getpid(), getpid());
    // 调用gcore生成核心转储
    system(cmd);
    // 恢复默认信号处理并重新触发,保证进程正常退出
    signal(sig, SIG_DFL);
    raise(sig);
}

int main() {
    // 设置核心转储大小限制
    struct rlimit rlim;
    rlim.rlim_cur = RLIM_INFINITY;
    rlim.rlim_max = RLIM_INFINITY;
    setrlimit(RLIMIT_CORE, &rlim);

    // 注册崩溃信号的处理函数
    signal(SIGSEGV, crash_handler);
    signal(SIGABRT, crash_handler);
    signal(SIGFPE, crash_handler);

    // 后续应用逻辑...
    return 0;
}

注意事项

  1. 系统需要安装gdb包(gcore是gdb的附属工具)。
  2. 信号处理函数中尽量避免复杂逻辑,防止出现死锁或二次崩溃。
  3. 此方法会额外创建子进程执行gcore,性能开销略高于方案一。

验证核心转储

编译时需带上调试符号(-g参数),运行应用触发崩溃后,前往指定目录检查核心文件是否生成。使用gdb ./myapp ./coredumps/myapp-1234.core即可加载核心文件,查看完整堆栈跟踪和变量值。

内容的提问来源于stack exchange,提问作者Gustavo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 10:28:27