2 kyelin kyelin 于 2014.11.17 19:47 提问

哪些情况会导致程序不抛出异常而直接结束?

程序在入口已经加入 SetUnhandledExceptionFilter 设置了异常处理,平时程序崩溃都能正常跳到异常处理发送错误报告, 但是最近程序突然崩溃且没有异常抛出了.

求教: 哪些情况会导致程序直接退出而不会抛出异常?

3个回答

caozhy
caozhy   Ds   Rxr 2014.11.18 16:45

一般CLR本身遇到严重的问题,可能不会丢出异常,比如互操作调用的函数破坏了内存、堆栈,运行不良的COM组件,CLR进程被强行关闭(包括进程强制结束)等等。

kifile
kifile   Rxr 2014.11.18 08:45

你在入口加了异常处理,并不代表你对每一个线程都可以响应他的异常,你去看看,会不会是由于多线程引发的,你可以连接到电脑上通过 logcat 查看一下错误

zilaishuichina
zilaishuichina   Rxr 2014.11.19 11:39

VS2005,CRT的一些与安全相关的代码做了些改动,典型的,例如增加了对缓冲溢出的检查。新CRT版本在出现错误时强制把异常抛给默认的调试器(如果没有配置的话,默认是Dr.Watson),而不再通知应用程序设置的异常捕获函数,这种行为主要在以下三种情况出现。

调用abort函数,并且设置了_CALL_REPORTFAULT选项(这个选项在Release版本是默认设置的)。
启用了运行时安全检查选项,并且在软件运行时检查出安全性错误,例如出现缓存溢出。(安全检查选项 /GS 默认也是打开的)
遇到_invalid_parameter错误,而应用程序又没有主动调用_set_invalid_parameter_handler设置错误捕获函数。

所以,使用VS2005及以后编译的程序,许多错误都不能在SetUnhandledExceptionFilter捕获到。这是CRT相对于前面版本的一个比较大的改变,但是很遗憾,微软却没有在相应的文档明确指出。

PS:lz如果想捕获这些异常,推荐debugging tool,也是微软出的,安装之后配置一下注册表就可以了

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!