.NET运行时错误导致进程崩溃!但是没有未处理的异常-为什么?CLR漏洞?

7
我有一个24/7运行的.Net进程,每周会崩溃一两次。我已经将AppDomain.CurrentDomain.UnhandledException事件连接到log4net上,但是该事件从未被触发!进程崩溃时没有记录任何信息!这看起来像是一个.Net运行时/CLR错误,因为我只收到事件日志中的消息““.NET Runtime 2.0 Error”。
我正在运行.Net 3.0 Sp1。
请问有人能帮助我解决这个问题吗?
事件日志消息: .NET Runtime 2.0 错误类型:错误 事件ID:1000
事件日志描述:故障应用程序appName.exe,版本0.0.0.0,时间戳4ca5d33d,故障模块mscorwks.dll,版本2.0.50727.3607,时间戳4add5446,调试?0,故障地址0x0010724e。

那是消息的全部内容吗?通常会包含类似于“故障应用程序foo.exe...”这样的信息。 - jason
.NET 3.0和.NET 3.5实际上是在运行.NET 2.0,只是提供信息。 - Kris Ivanov
1
我怀疑这不是CLR的问题。更有可能是某段代码出错了。你能贴出事件日志的详细信息吗? - Falcon
1
事件日志中是否有关于此错误的描述? - Tony Abrams
添加了有关故障的额外信息 - arkina
1
这是什么类型的应用程序?WPF?WinForm?Windows服务?有COM互操作吗?事件查看器“描述”内容是什么? - johnny g
5个回答

3

我认为StackOverflowException不会像这样被捕获,因为没有代码可以运行。这可能是一个经常发生的问题 - 你可能需要检查你的代码中是否有无限循环/递归。


1

一些有趣的反馈,但值得一提的是不同类型的应用程序可能会在不同的事件处理程序上抛出异常。

对于Windows服务,我们应该安全地处理

static void Main (string[] args) 
{
    AppDomain.CurrentDomain.UnhandledException +=
        CurrentDomain_UnhandledException;
}

针对WinForms应用程序,我们还应该处理额外的未处理事件处理程序。
static void Main (string[] args) 
{
    AppDomain.CurrentDomain.UnhandledException +=
        CurrentDomain_UnhandledException;
    System.Windows.Forms.Application.ThreadException +=
        Application_ThreadException; 
}

对于一个 WPF 应用程序,提供了一个调度事件来处理 GUI 异常。
static void Main (string[] args) 
{
    AppDomain.CurrentDomain.UnhandledException +=
        CurrentDomain_UnhandledException;
    Application.Current.DispatcherUnhandledException +=
        Application_DispatcherException; 
}

值得再次强调的是,任何未处理的异常通常会导致程序终止。然而,处理这些事件可以让我们有机会报告和识别根本错误。
以下是可能有帮助的其他链接:

我的问题关于未处理的GUI异常(重复)

WPF全局异常处理程序


1

0

3
如果应用程序是单线程的话,这是一条好建议。不幸的是,在多线程应用程序中,由错误子线程抛出的未处理异常(off-thread)将无法被捕获,往往导致程序终止。 - johnny g

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接