测试正文中抛出代码为0xc0000005的SEH异常

时间:2012-10-31 12:11:15

标签: c++ visual-c++ tdd googletest

我正在使用GoogleTest为以下课程编写测试,我收到了上述错误。

class Base
{
    // Other Functions;

    CSig objSig[50];
}

Class CSig如下:

class CSig
{
    //... constructor, destructor(empty) and some functions
    CMod *objMod;
    CDemod *objDemod;
}

CSig :: CSig
{
    bIsInitialised = false;

    for (int i=0; i<MAX_NUM; i++)
    {
        PStrokePrev[i] = 0.0;
    }
}

但是,当我放弃CSig objSig[50]时,测试运行正常。

我该怎么做才能解决这个问题?另外,我需要在Base类中使用CSig objSig[50]

8 个答案:

答案 0 :(得分:24)

SEH(结构化异常处理)异常不是C ++ - 可以使用c ++语言结构(try-catch)处理的异常,但它是从windows本身引发的,并指向一些基本缺陷。 SEH-异常非常烦人,因为它们不会导致正常的堆栈展开,这会导致未关闭的文件或未解锁的互斥锁,这些互斥锁通常应由拥有对象的析构函数清除。 我在访问不属于当前进程的内存时遇到了SEH异常,所以我建议在CSig的构造函数和析构函数中查看与内存相关的指令。 您可以阅读有关SEH的信息,例如here

答案 1 :(得分:11)

我刚刚发现问题的方法是在Visual Studio中我去了Debug-&gt; Exceptions,并检查了第一列中的所有内容。然后运行/调试您的单元测试,它将在问题所在的行上引发异常。这就是你需要调试/修复它的地方。

答案 2 :(得分:5)

我在Visual Studio 2010中使用GoogleTest遇到了这个问题。我们的设置包括为GoogleTest框架创建一个库,然后将其与我们各自的单元测试相关联。我最近更新了Frameworks支持并从头开始重新编译它。执行此操作后,我遇到了上述异常。

经过一番挖掘后,我发现“结构成员对齐”设置是罪魁祸首:

项目属性&gt;配置属性&gt; C / C ++&gt;代码生成&gt;结构成员对齐

虽然Frameworks项目的设置设置为“default”,但相应的Unit Test项目已将其配置为“1 Byte / Zp1”。一旦我将它们更改为具有相同的对齐方式,问题就会消失。

答案 3 :(得分:3)

对我来说,它似乎是一个空引用错误。在nullptr上调用了一些方法,由于我不明白的原因,它没有立即失败但只是开始执行。一旦访问了未分配的内存,就可能发生SEH错误。所以检查空指针!

答案 4 :(得分:1)

我遇到了类似的问题,它与未初始化的变量有关,并在发布版本中运行测试。我有一个未初始化的char *,之后初始化为NULL似乎解决了这个问题。

答案 5 :(得分:1)

销毁空指针可能是一个原因。我是通过 Visual Studio > Exception > Select All 发现的。然后运行本地windows调试器,它停在发生异常的行。

答案 6 :(得分:0)

如果您使用的是Visual Studio 2013,请在Debug&gt; Exceptions中查看Win32异常(特别是访问冲突)的Thrown框。这将让您调试哪一行有问题。这可能很有用,因为如果程序通常引发其他异常,调试器不会中断。

答案 7 :(得分:0)

在qt中使用msvc遇到此问题。 SEH几乎是随机抛出的,没有明显原因。 (阅读:没有时间研究它了) 在找不到正确的解决方案并且测试似乎适用于非Windows用户之后,我切换到了MinGW,它可以正常运行测试。