4

我遇到了一个应用程序挂起的问题,并给了我默认的“请告诉 Microsoft 这个问题”弹出窗口,而不是应用程序中的“未处理的异常”对话框。

在应用程序代码中,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 system.argumentoutofrange、P10 NIL

鉴于该错误似乎仅在应用程序运行几个小时后才发生,我想知道它是否可能是内存泄漏问题。我搜索了一些“clr20e3”,但只找到了 ASP.Net 的东西。我的应用程序是 Windows Forms (.Net 2.0) exe,使用了相当多的程序集——在 C# 和一些非托管 C++ 中。

我想这也可能是错误处理方法中的错误 - 正如一些答案所暗示的那样,我可能会尝试在错误处理程序的开头进行记录(但考虑到这几乎就是我所做的......)。

任何解决此问题的帮助将不胜感激 - 无论是解决方案,还是有关如何找出问题根本原因的建议。

更新:原始错误的根本原因是访问具有负索引的数组(即 system.argumentoutofrange)。为什么这没有被困住对我来说有点神秘,但是考虑到两个异常都被发送到相同的处理代码,我想知道是否可能没有条件(例如)两者都被调用并争夺资源(例如日志文件)?

我设法通过在错误处理代码中的任何其他内容之前执行 EventLog.WriteEntry 来证明这一点。现在添加了一个标志以防止在错误处理中重新进入,我似乎不再有问题......

4

3 回答 3

1

只是在这里在黑暗中拍摄 - ArgumentOutOfRangeException 实际上是从您的异常处理程序中抛出的吗?

此外,您没有说有什么类型的应用程序有问题- Application.ThreadException 只影响 WinForms 线程,所以如果这不是 GUI 应用程序,它是无用的。(请参阅MSDN 文档中的备注部分)

于 2008-09-18T13:20:12.483 回答
1

您是否检查过是否ArgumentOutOfRangeException从您的处理程序本身抛出?可能值得在异常处理程序的入口处对事件日志或跟踪进行简单的写入,并确认您确实在命中它。

编辑:写入事件日志的信息可以在以下位置找到:

http://support.microsoft.com/kb/307024

于 2008-09-18T13:24:08.183 回答
0

您是否不止一次调用 Application.Run() ?这将显示您描述的相同症状。您必须编写一个自定义 ApplicationContext 类作为解决方法。只是我的 0.02 美元经通胀调整。

于 2010-12-06T17:05:36.607 回答