c#调试windows崩溃

问题描述:

我有一个应用程序,大约20分钟的空闲时间后程序崩溃。 (“Windows遇到错误,需要关闭...”)c#调试windows崩溃

我不知道为什么会发生这种情况。什么是最好的方式去调试这样的事情?

一般崩溃.NET应用程序是由未处理的异常引起的 - 在一个没有按某种形式的try-catch块捕获该应用程序的线程,即一个例外:

try 
{ 
    // Some code that may throw an exception 
} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex.ToString()); 
} 

一个良好的第一地方检查有关此异常的信息是应用程序事件日志,但是经常会发现.Net框架仅发布关于崩溃的最少信息 - 如果是这种情况,则需要自己捕获并处理异常,并将足够的信息记录到允许您诊断错误。

通常有两种方式,你可以这样做:

1.确保你的应用程序的每个线程的代码包含在一个try-catch块。

这是最简单的方法 - 除非您的应用程序有多个用户线程(您会知道它是否有),这只需要您在应用程序的入口点放置一个try-catch块,例如Windows窗体应用程序:

// Probably found somewhere in Program.cs 
[STAThread] 
static void Main() 
{ 
    try 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 
} 

如果你在一个控制台应用程序的工作,那么你将需要使用其他的东西比MessageBox(见第一个例子)。

如果你产生了多个线程,那么每个线程的入口点方法也应该以类似的方式捕获所有异常。

2.手柄,只要任何线程抛出当前应用程序域未处理的异常当前应用程序域

此事件的UnhandledException事件将被解雇。一般而言,最好使用第一种方法,但在某些情况下,此事件仍然有用。

实施例:

static void Main() 
{ 
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 
    // The rest of your application 
} 

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    Console.WriteLine(e.ExceptionObject.ToString()); 
} 

当然是值得指出的是错误仍然可能不能由任一上述两种方法的(这是可能的,如果错误是由本机模块引起抓在相同的过程中加载),但是这应该可以做到这一点。

最后 - 祝你好运!