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

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断言要求抛出的是异常类实例:

  1. 你的common文件中自定义异常的标准实现应该是:定义一个继承std::exception的异常类(通常命名为BustubException),类内部包含ExceptionType类型的成员变量存储具体异常分类。
  2. 正确的抛出写法应为throw BustubException(ExceptionType::OUT_OF_RANGE);,而非直接抛出枚举值。
  3. 测试用例中使用的ThrowsBustubException宏,内部逻辑是捕获BustubException类型的异常后,再判断其异常类型是否和传入的枚举值匹配。你直接抛出枚举值时,该宏无法捕获对应类型的异常,异常会泄漏到GTest框架外层,框架无法识别枚举类型的异常,就会返回「Unknown C++ exception thrown in test body」报错。

小概率排查点:如果确认抛出的是异常类实例,可以检查自定义异常是否继承了std::exception、ThrowsBustubException宏的捕获类型是否和自定义异常类匹配。

内容的提问来源于stack exchange,提问作者Justin Philip Fulkerson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:18:04