2012-07-20 94 views
0

我正在使用winforms在Visual C#中開發應用程序。Winforms應用程序崩潰

該應用程序基本上是一個包含三個選項卡的屏幕。 它顯示來自系統每秒運行的進程的值(使用System.Diagnostics.Process[])。

它生成和更新大量的數字和計算(約4000 /秒)。但是經過10000次迭代或大約45分鐘的工作後,它只會崩潰,而令人驚歎的部分是它總是在同一時間崩潰。

這裏涉及的內存僅爲70mb,在windows xp和windows 7下,應用程序的負載永遠不會超過35%。該應用程序的目的是讓用戶能夠使用cpuload和內存查看在系統上運行的進程加載。由於安全原因,我們不能建議taskmanager。

的錯誤不是由任何try - catch方法

下列屏幕的樣本崩潰後跟隨被困C#

enter image description here

主應用程序屏幕看起來像這樣

enter image description here

有人遇到過這種情況下,應用程序在固定運行時間後崩潰。

請建議一種診斷工具或方法來捕獲此類錯誤。

感謝您的答覆

+0

你有沒有檢查是否有內存泄漏啓動選項?你有任何代碼smaple? – JohnnBlade 2012-07-20 06:12:43

+0

它只是一個運行無限循環的計時器,它可以獲取網格中的所有進程和顯示。像{Process [] plist = Process。GetProcesses(); (true);內存泄漏(甚至更大的應用程序運行良好,加上它在固定運行後總是崩潰)。 BTW在WordPress的博客很好。 – arvind 2012-07-20 06:16:57

+0

使用計時器並不意味着計時器對象正確,您是否嘗試過使用計時器對象而不是使用無限循環。 Thnx我儘可能地更新我的博客 – JohnnBlade 2012-07-20 06:22:33

回答

4

嘗試添加該到你的服務在主空

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 

     public static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
     { 
      // do your logging here, write to a file, or send an email 
     } 

service.ExceptionThrown += service_ExceptionThrown; 

     private static void service_ExceptionThrown(object sender, ExceptionThrownEventArgs e) 
     { 
      // do your logging here, write to a file, or send an email 
     } 

,如果你要調試在Visual Studio中的服務的話,只需添加-d通過在命令行參數

Command line argumnets

+0

@johnblade:我用了一個計時器,循環只是遍歷所有的過程,像foreach(在plist中的Process p){}。是的,我也嘗試使用backgroundworker。甚至把thread.sleep(1000)放慢了一點。是否有任何工具只是以某種方式指向錯誤。我已經下載了CLR分析器,但是上帝看起來需要整整一個星期來操作它。 (沒有任何數據保存或數據表) – arvind 2012-07-20 07:44:38

+0

你可以使用-d參數讓它在visual studio中運行嗎? – JohnnBlade 2012-07-20 07:48:42

+0

我已經設置了-d選項,並且需要在Visual Studio中運行它。我將把事件處理程序(我想我需要將它們放在program.cs中) – arvind 2012-07-20 07:49:07

4

如果你有這臺機器上安裝了Visual Studio,你應該能夠調試應用程序,當它崩潰。至少你應該看到拋出哪個異常以及在哪裏。

在我的應用程序中,我有一個處理程序,它捕獲未捕獲的異常並將它們寫入日誌文件。

添加到構造

AppDomain currDomain = AppDomain.CurrentDomain; 
currDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExHandler); 

,並添加此處理

private void UnhandledExHandler(object sender, UnhandledExceptionEventArgs args) 
{ 
    Exception e = (Exception)args.ExceptionObject; 
    // Log the exception here 
} 
+0

我會試着用調試器。 – arvind 2012-07-20 07:44:02