不知道使用 google-test 在哪里抛出异常

Don't know where exception was thrown using google-test

我们使用 Google Test 作为我们的 C++ 单元测试框架。但是我 运行 陷入了痛苦的境地,不知道该如何应对。

基本上,当代码中存在未捕获的异常时,我会在控制台中打印以下错误消息并得到 FAILED。很明显,这个异常是被google测试捕获的。但是,我根本不知道异常在哪里抛出。

unknown file: error: SEH exception with code 0xc000005 thrown in the test body.

我能做的就是调试和单步调试代码,我最终会找出问题所在。但这不是很有效,因为项目很大。

我希望调试器在未捕获的异常行处停止并给我一个漂亮的调用堆栈。 google 测试中是否有我不知道的设置?任何其他解决方法或建议将不胜感激。

编辑:我正在 Windows 下寻找类似以下的内容

最后根据答案,我找到了 visual studio 的这个设置,现在一切都按照我想要的方式工作:)

这是不可能的,因为 C++ 不会在异常对象中保留堆栈跟踪,即使 gtest 有一些智能捕获机制,它也无法知道异常来自何处。你能做的最好的事情就是自己在异常中存储一些信息并在测试用例中检查它。

在工作中,我使用的方法是 运行 仅使用 gdb 的失败测试用例,如下所示:

gdb /path/to/test
catch throw
r --gtest_filter='Test.Testcase' --gmock_verbose=info
bt

使用 visual studio,我怀疑您应该能够像上面那样使用参数启动二进制文件,并为任何抛出设置断点,然后查看回溯。

SEH 异常不是 C++ 异常。

这是一个 windows 异常,在标准 C++ 异常处理框架之外抛出(捕获它们的语法不同)。

找到位置的最佳方法是 运行 DevStudio 中的这个。已经有一段时间了,但我确信 DevStudio 可以选择在抛出 SEH 异常时中断。只需打开它,您的调试器就会在抛出点停止并允许您进行调试。

参见:https://msdn.microsoft.com/en-us/library/d14azbfh.aspx

如@MatthiasVegh 所述,您还应该通过测试的名称,这样您就不必 运行 通过所有测试。