C++ 如何定位未处理的异常

C++ 如何定位未处理的异常,c++,exception,C++,Exception,我正在使用visual studio 2013用c++11编写一个程序。 当程序结束时,也就是说在它完成主程序之后,我得到以下异常: prog.exe中0x00EB1AC6处的首次机会异常:0xC0000005:访问冲突读取位置0xFEEEFE 这是什么原因造成的?我的意思是,没有更多的代码行 编辑:在调试中,我被带到这个文件:crtexe.c 此处出现异常:第648-649行: ifndef\u CRT\u应用程序 谢谢你的建议 在调试菜单中,选择异常。勾选所有项目。重播。现在,每当第一次抛出

我正在使用visual studio 2013用c++11编写一个程序。 当程序结束时,也就是说在它完成主程序之后,我得到以下异常:

prog.exe中0x00EB1AC6处的首次机会异常:0xC0000005:访问冲突读取位置0xFEEEFE

这是什么原因造成的?我的意思是,没有更多的代码行

编辑:在调试中,我被带到这个文件:crtexe.c 此处出现异常:第648-649行:

ifndef\u CRT\u应用程序
谢谢你的建议

在调试菜单中,选择异常。勾选所有项目。重播。现在,每当第一次抛出异常时,它将触发断点


请注意,错误消息表明已以某种方式处理了异常。

全局或静态对象(或在退出时注册的其他代码)有一个析构函数,该对象引用已释放的内存

线索是:

  • 地址
    0xFEEEFEEE
    是MSVC++中动态内存函数的调试版本用来标记已释放内存的填充模式。所以你认为里面仍然有一个有效的指针,你正在访问它

  • 崩溃发生在main返回之后,因此很可能是析构函数或at_exit函数

  • < >静态对象的析构函数在C++中没有完全定义,所以有一个静态对象引用另一个不再存在的静态对象是常见错误。它与静态对象的不确定构造顺序相反

您可以通过将调试器设置为在第一次出现异常时中断来调试它。当崩溃发生时,您几乎可以肯定地看到哪个析构函数正在堆栈上运行。您可以通过不依赖静态对象的销毁(或构造)顺序来修复它


由于您是多线程的,也可能是主线程已经结束,而其他一些线程仍在访问全局对象。(我不认为这是你的问题,因为它崩溃时你在堆栈中的位置,但我没有足够的信息来确定。)一般来说,你必须防止主线程在工作线程之前结束(通过在退出原始线程之前连接线程),或者你必须强制终止进程,而不是让正常的退出发生。首选第一个选项。

main()完成后,会发生很多事情。例如,析构函数将被调用并释放内存。您至少可以给我们堆栈帧吗?它们肯定会指出问题出在哪个函数上?您在使用线程吗?0xFEEEFEEE表示您正在尝试访问已由堆释放的内存。您的一个全局函数的析构函数正在尝试使用已释放的内存。
            exit(mainret);