2010-10-22 178 views
0

我有一個應用程序,大約20分鐘的空閒時間後程序崩潰。 (「Windows遇到錯誤,需要關閉...」)c#調試windows崩潰

我不知道爲什麼會發生這種情況。什麼是最好的方式去調試這樣的事情?

回答

3

一般崩潰.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()); 
} 

當然是值得指出的是錯誤仍然可能不能由任一上述兩種方法的(這是可能的,如果錯誤是由本機模塊引起抓在相同的過程中加載),但是這應該可以做到這一點。

最後 - 祝你好運!