bazel test运行测试时缺失SEGFAULT错误提示的问题咨询
Bazel测试触发SEGFAULT无报错提示的解决方案
该问题根源是Bazel默认测试沙箱会拦截系统向终端输出的进程崩溃信号日志,同时自研测试框架没有主动捕获并打印SIGSEGV信号,导致段错误信息既没有输出到终端也没有写入测试日志。你可以按以下顺序排查配置:
- 首先尝试关闭测试沙箱,启用信号透传:
添加参数--spawn_strategy=local --sandbox_debug,禁用沙箱隔离后系统产生的段错误提示会直接透传到测试输出中,同时沙箱调试参数会打印测试进程的退出信号值(段错误对应信号值11,退出码139)。 - 使用系统工具捕获崩溃信息:
执行测试时添加参数--run_under="catchsegv",catchsegv工具会主动监控测试进程,触发段错误时直接打印崩溃栈、内存地址等信息到标准错误流,Bazel会将该内容纳入测试日志与输出。如果需要更详细的栈信息,也可以替换为--run_under="gdb -q --ex run --ex bt --ex quit",崩溃时自动打印调用栈。 - 增加测试执行包装脚本主动上报信号:
给你的自研测试套增加shell包装层,执行测试二进制后判断退出码:如果退出码为139主动打印*测试触发SEGFAULT段错误*到标准错误流,Bazel的测试日志捕获逻辑会自动拾取该内容。 - 关闭输出缓冲避免内容丢失:
部分场景下段错误触发时输出缓冲区内容未刷入磁盘,会导致日志丢失,可添加参数--run_under="stdbuf -i0 -o0 -e0"强制关闭标准输入输出的缓冲,确保所有内容都能写入日志。 - 补充测试输出参数:
除你已经使用的参数外,额外添加--test_summary=detailed,该参数会在测试总结中打印所有异常测试的退出信号值与退出码,你可以直接从总结中看到对应测试是否触发139退出码的段错误。
内容的提问来源于stack exchange,提问作者TacoVox
相关产品推荐
相关产品推荐

