如果没有人调用该函数,为啥我会得到第一次机会异常?

Posted

技术标签:

【中文标题】如果没有人调用该函数,为啥我会得到第一次机会异常?【英文标题】:Why I get First-chance exception if no one calls the function?如果没有人调用该函数,为什么我会得到第一次机会异常? 【发布时间】:2013-06-02 14:53:31 【问题描述】:

突然我的代码开始抛出异常First-chance exception at 0x7731c41f in VideoPlayer.exe: Microsoft C++ exception: GenICam::RuntimeException at memory location 0x0018f5dc..,我找不到它到底是从哪里抛出的,所以我在main函数和main之外的所有内容都注释了。我开始一一取消注释代码块,而 main 中的代码仍然注释。这样做时我注意到有一个函数A,当它被注释时没有异常,但是当它被取消注释时,它会抛出上面的异常。

我不明白如果不调用它会如何导致异常(我在其中放置了断点并且注释了 main 中的代码)?

【问题讨论】:

您是否更改了任何项目属性?? @IAMHERE,不,我没有。 【参考方案1】:

您的函数将在静态初始化期间使用。 举个例子:

#include <iostream>
bool static_func()

    std::cout << "Before main" << std::endl;
    return true;

static const bool b = static_func();
int main()

    std::cout << "We are main" << std::endl;
    return 0;

由于您只看到第一次机会异常,它将被捕获和处理。例如,我在抽象工厂中看到过这样的构造,工厂自行配置。 你的断点没有命中的原因一定是别的原因。

【讨论】:

我检查了 A 函数中的代码,并且使用了 3rd-party 类型 (BCamera camera;)。可能当 A 被注释时,链接器将其从最终代码中排除,而当 A 未注释时,链接器包含该类型,因此可能在某处存在一些全局/静态对象实例化。有没有办法调试这样的东西?【参考方案2】:

在 VS 中,Debug 菜单,Exceptions...检查匹配类型的 throw 列。然后开始调试,它会在 throw 发生的地方停止。你可以看看为什么。

【讨论】:

以上是关于如果没有人调用该函数,为啥我会得到第一次机会异常?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会得到“未处理的异常类型 IOException”?

为啥我没有获得第一次机会异常的转储文件

发生了第一次机会异常......我不知道为啥

为啥我会收到“CSRF 令牌丢失或不正确”错误?

如果上天再给我一次机会,我会这样学Java

异常时无法正确获取调用堆栈