测试主体中抛出代码为 0xc0000005 的 SEH 异常

问题描述 投票:0回答:10

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

class Base
{
    // Other Functions;

    CSig objSig[50];
}

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]
时,测试运行良好。

我可以做什么来解决这个问题?另外,我需要在基础类中有

CSig objSig[50]

c++ visual-c++ tdd googletest
10个回答
44
投票

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


16
投票

我刚刚发现问题的方法是在 Visual Studio 中转到“调试”->“异常”,并检查第一列中的所有内容。然后运行/调试您的单元测试,它会在问题所在的行上抛出异常。这就是您需要调试/修复它的地方。


11
投票

我在 Visual Studio 2010 中使用 GoogleTest 时遇到了这个问题。我们的设置涉及为 GoogleTest 框架创建一个库,然后将其链接到我们单独的单元测试。我最近更新了框架支持并从头开始重新编译。这样做之后,我遇到了上面描述的异常。

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

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

虽然框架项目将设置设置为“默认”,但相应的单元测试项目将其配置为“1 字节/Zp1”。一旦我将它们更改为具有相同的对齐方式,问题就消失了。


4
投票

对我来说,这似乎是一个空引用错误。在 nullptr 上调用了某些方法,由于我不清楚的原因,它并没有立即失败,而是刚刚开始执行。据推测,一旦访问未分配的内存,就会发生 SEH 错误。所以检查空指针!


3
投票

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


1
投票

如果您使用的是 Visual Studio 2013,请在调试 > 异常中选中 Win32 异常(特别是访问冲突)的抛出框。这将让您调试哪一行有问题。这可能很有用,因为如果您的程序正常引发其他异常,调试器不会中断。


1
投票

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


0
投票

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


0
投票


0
投票

要使用 protobuf,我遵循了

此处

的说明,特别是针对 Windows 的 vcpkg 安装。 事实证明,Gtest 项目从父级继承了链接器中的库,最终链接到 libprotobuf 和 libprotobuf_lite,而不是 libprotobufd 和 libprotobuf_lited,后者是调试版本。这是因为默认情况下,Properties->Linker->Input 下的附加依赖项中的路径最终提供了与 $(_ZVcpkgCurrentInstalledDir)$(_ZVcpkgConfigSubdir)lib*.lib 链接的选项,这是 protobuf 库的免费构建所在的位置.

将路径更改为 $(_ZVcpkgCurrentInstalledDir)$(_ZVcpkgConfigSubdir)debug\lib*.lib 问题解决了,异常也消失了。

© www.soinside.com 2019 - 2024. All rights reserved.