Google Test出现unknown file Failure报错,如何用gdb定位问题根因?
问题1:GTest 搭配 GDB 追踪异常的方法
按照以下步骤操作即可快速定位异常抛出位置:
- 编译测试程序时添加
-g参数开启调试信息,同时关闭O2等编译优化,避免调试时行号、变量信息丢失。 - 启动GDB加载编译好的测试可执行文件:
gdb ./<你的测试可执行文件名> - 进入GDB交互界面后,先设置异常捕获断点:
catch throw,配置后所有C++异常抛出时都会自动触发中断。 - 仅运行出错的单条测试用例,减少不必要的执行流程:
run --gtest_filter=StarterTest.InitializationTest - 触发断点后输入
bt即可打印完整调用栈,直接定位到抛出异常的代码行,也可通过p <变量名>命令查看对应位置的变量值排查问题。
问题2:报错原因分析
该报错基本是由自定义异常的抛出逻辑错误导致的,核心问题如下:
你当前的抛出写法是throw ExceptionType::OUT_OF_RANGE;,直接抛出了枚举值,而C++异常体系和GTest断言要求抛出的是异常类实例:
- 你的common文件中自定义异常的标准实现应该是:定义一个继承
std::exception的异常类(通常命名为BustubException),类内部包含ExceptionType类型的成员变量存储具体异常分类。 - 正确的抛出写法应为
throw BustubException(ExceptionType::OUT_OF_RANGE);,而非直接抛出枚举值。 - 测试用例中使用的
ThrowsBustubException宏,内部逻辑是捕获BustubException类型的异常后,再判断其异常类型是否和传入的枚举值匹配。你直接抛出枚举值时,该宏无法捕获对应类型的异常,异常会泄漏到GTest框架外层,框架无法识别枚举类型的异常,就会返回「Unknown C++ exception thrown in test body」报错。
小概率排查点:如果确认抛出的是异常类实例,可以检查自定义异常是否继承了std::exception、ThrowsBustubException宏的捕获类型是否和自定义异常类匹配。
内容的提问来源于stack exchange,提问作者Justin Philip Fulkerson
相关产品推荐
相关产品推荐

