通过Application.ThreadException和AppDomain.CurrentDomain.UnhandledException的异常
我遇到了一个应用程序挂起的问题,并给了我默认的"请告诉微软有关此问题"的弹出窗口,而不是应用程序中的"未处理的异常"对话框。
在应用程序代码中,Application.ThreadException和AppDomain.CurrentDomain.UnhandledException都被重定向到将错误日志写入磁盘,将屏幕快照保存到磁盘并显示友好对话框的方法。
但是,当发生此错误时,这三件事均不会发生。我得到的只是事件查看器中的代码:
EventType clr20e3,P1 myapp.exe,P2 4.0.0.0,P3 47d794d4,P4 mscorlib,P5 2.0.0.0,P6 471ebc5b,P7 15e5,P8 27,P9系统。
鉴于该错误似乎仅在应用程序运行了几个小时之后才发生,我想知道这是否可能是内存泄漏问题。我已经搜索了一些" clr20e3",但只找到了ASP.Net。我的应用程序是Windows Forms(.Net 2.0)exe,在Cand和非托管C ++中都使用了很多程序集。
我想这也可能是错误处理方法中的错误,正如一些答案所暗示的那样,我可以尝试在错误处理程序的开始处记录日志(但是鉴于那无论如何我都是这么做的...)。
无论是解决方案,还是关于如何找出问题的根本原因的建议,对解决此问题的任何帮助将不胜感激。
更新:原始错误的根本原因是访问具有负索引的数组(即system.argumentoutofrange)。为什么这没有被捕获对我来说还是个谜,但是鉴于两个异常都发送到了相同的处理代码,我想知道是否不存在这样的情况:(例如)两者都被调用并争用资源(例如,日志文件)?
我通过在错误处理代码之前执行EventLog.WriteEntry来证明了这一点。现在添加了一个标志来防止错误处理再次输入,我似乎不再有问题...
解决方案
只是在黑暗中拍摄,是否有可能实际上是从异常处理程序中抛出了ArgumentOutOfRangeException?
此外,我们没有说出问题类型的应用程序-Application.ThreadException仅影响WinForms线程,因此,如果这不是GUI应用程序,那就没有用了。 (请参阅MSDN文档中的"备注"部分)
我们是否检查过处理程序本身是否抛出过" ArgumentOutOfRangeException"?可能值得对事件日志或者异常处理程序入口处的跟踪进行简单的写入,并确认我们确实在击中它。
编辑:可以在以下位置找到写入事件日志的信息:
http://support.microsoft.com/kb/307024
我们是否多次调用Application.Run()?这将显示与我们描述的相同的符号。我们必须编写一个自定义ApplicationContext类作为解决方法。仅调整了我的$ 0.02(根据通货膨胀)。