如何让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
相关产品推荐
相关产品推荐

