2

我们使用Google Test作为我们的C++单元测试框架。但是我遇到了一个痛苦的局面,不知道如何处理。不知道使用谷歌测试引发异常的位置

基本上,当代码中存在未捕获的异常时,我在控制台中打印出以下错误消息并获得失败。显然,例外是通过谷歌测试捕获。但是,我根本没有任何信息在哪里抛出。

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

我可以做的是调试,并逐步通过代码,我最终会找出问题所在。但是这个项目很大,效率不高。

我想调试器停在未捕获的异常行,给我一个很好的调用堆栈。谷歌测试中是否有任何设置我不知道?任何其他解决方法或建议将非常感激。

编辑:我正在寻找的东西,如Windows enter image description here

最后根据答案在以下,我发现Visual Studio的这个设置,一切正常的方式我现在想:) enter image description here

回答

2

SEH异常是不是一个C++异常。

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

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

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

正如@MatthiasVegh你应该通过测试的名称,所以你不必通过所有的测试运行注意。

+0

不错!这正是我正在寻找的!谢谢! –

1

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

+0

感谢您的回答。如果异常不是我自己抛出的,例如:被零除异常,或者使用释放的内存等,那么我不能存储任何想到的信息。而且我知道在Xcode下,我们可以添加异常断点,并且在Visual Studio下,它也会在异常点自动中断(请参阅我的新增截图)。不知何故,调试器可能已经存储了异常信息? –

+1

您可以在相应的对话框中添加一个例外类型以停止(Ctrl + Alt + E)。但是,您必须为所有需要的异常(或某些基类)执行此操作,即使出现“第一次机会异常”AFAIK也会停止。但这并不意味着它会在某处存储异常信息。它可能会破坏它,因为调试器对每条指令都有信息,并且可能会在引发它的地方检查异常。但它是调试器特权,您无法获得该信息。 – ixSci

6

在工作中我使用的方法是运行只用gdb像这样失败的测试用例:

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

与Visual Studio,我怀疑你应该能够开始使用参数的二进制如上,并设置任何投掷的断点,然后看看回溯。

+2

很高兴知道'gdb'的catch catch。我一定会尝试这个。但是你知道'nmake'的任何等价设置吗? –

相关问题