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

如何捕获无Core Dump的段错误?子进程段错误检测排查

解决子进程无Core Dump时的段错误检测问题

我来帮你理清这个问题——你其实是搞混了信号编号对应的含义,以及core dump和段错误信号的关联逻辑,才导致没抓到无core dump的段错误情况。

首先先明确几个关键信号的定义,别再被手册里的描述误导了:

  • SIGSEGV(信号编号11):这才是标准POSIX系统中,进程发生段错误时会收到的信号,不管有没有生成core dump,只要是段错误导致进程终止,都会触发这个信号。
  • SIGBUS(信号编号7):这是总线错误,和段错误类似但原因不同(比如访问未对齐的内存地址),不属于段错误范畴。
  • SIGUSR1(信号编号10):这是用户自定义信号,完全和段错误无关,手册里的相关描述大概率是你理解错了场景。

你的问题核心在于:core dump只是段错误发生后的可选行为(取决于系统的ulimit -c配置),但不管有没有生成core dump,段错误都会触发SIGSEGV(11)。你之前处理有core dump的段错误时刚好命中了信号11,但错误地把信号10也当成了段错误的触发信号,反而漏掉了无core dump时同样触发的信号11。

接下来修正你的代码逻辑,正确的做法是先判断进程是否被信号终止,再检查终止信号是否为SIGSEGV,同时可以用WCOREDUMP(status)区分是否生成了core dump:

if (WIFSIGNALED(status)) { // 先判断子进程是否被信号终止
    int term_sig = WTERMSIG(status);
    if (term_sig == SIGSEGV) {
        my_putstr("Segmentation fault");
        if (WCOREDUMP(status)) {
            my_putstr(" (core dumped)\n");
        } else {
            my_putstr("\n");
        }
    } else if (term_sig == SIGBUS) {
        my_putstr("Bus error\n");
    }
    // 其他需要处理的信号可以在这里补充
}

这样不管子进程发生段错误时有没有生成core dump,你都能准确捕获到并输出对应的提示。最后再提醒下:建议用信号宏(比如SIGSEGV)代替硬编码的数字,这样代码在不同系统上的兼容性更好,也更易读。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:23:24