如何找到未处理的异常

时间:2014-10-21 11:53:31

标签: c++ exception

我正在使用visual studio 2013在c ++ 11中编写程序。 当程序结束时,意味着在完成主程序之后,我得到了这个例外:

  

prog.exe中0x00EB1AC6的第一次机会异常:0xC0000005:访问冲突读取位置0xFEEEFEEE。

是什么导致这个?我的意思是,没有更多的代码......

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

ifndef _CRT_APP

            exit(mainret);

感谢您的任何建议!

2 个答案:

答案 0 :(得分:2)

在“调试”菜单中,选择“例外”。勾选一切。重新运行。现在,只要首次抛出异常,它就会触发断点。

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

答案 1 :(得分:0)

你有一个全局或静态对象的析构函数(或者你在at_exit注册的其他代码),它引用了已被释放的内存。

线索是:

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

  • 主要返回后发生崩溃,因此它可能是析构函数或at_exit函数。

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

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

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