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

如何让bash判断子进程是否发生segfault(段错误)?

Bash 内置判断子进程段错误的实现方案

核心原理

Bash 中被信号终止的子进程,退出码固定为 128 + 信号编号,段错误对应信号SIGSEGV的标准编号为11,因此退出码等于139即可判定子进程发生了段错误,无需额外开发C/C++辅助工具。

适配测试场景的实现步骤

步骤1:并行测试时捕获段错误的测试命令

在你现有的xargs调用逻辑外层包裹退出码判断逻辑,既保留原测试的返回值用于用例结果判定,同时将段错误的用例命令存入单独文件:

# 提前清空历史段错误命令记录
> segfault_test_cmds.txt

# 原有并行执行逻辑改造
cat 所有测试命令列表.txt | xargs -P 0 -L 1 -I CMD bash -c '
CMD
exit_code=$?
# 判定是否为段错误退出
if [ $exit_code -eq 139 ]; then
    echo "CMD" >> segfault_test_cmds.txt
fi
# 原返回值正常返回,不影响原有测试结果统计
exit $exit_code
'

步骤2:GDB下顺序重跑段错误用例

读取之前存储的段错误命令列表,自动调用GDB运行并输出调用栈:

while read -r test_cmd; do
    echo "===== 重跑段错误用例: $test_cmd ====="
    # 拆分可执行文件和参数
    exe_path=$(echo "$test_cmd" | awk '{print $1}')
    exe_args=$(echo "$test_cmd" | cut -d' ' -f2-)
    # 自动运行并打印完整调用栈,需要交互调试的话去掉-ex "quit"即可
    gdb -ex "run $exe_args" -ex "bt full" -ex "quit" --args "$exe_path" $exe_args
done < segfault_test_cmds.txt

注意事项

  • 该逻辑兼容所有POSIX标准系统,SIGSEGV编号11是通用标准,无跨平台兼容问题
  • 若你的测试用例存在主动返回139的特殊逻辑,可额外通过dmesg关联进程名做二次校验,常规测试场景无需处理
  • 如需捕获其他信号终止的用例,比如SIGABRT(信号6,退出码134),可按照相同逻辑扩展判断条件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 06:09:03