2012-08-25 205 views
7

發佈模式和調試模式有什麼區別?爲什麼我的應用程序在發佈模式下崩潰而不是在調試模式下崩潰?

如何在發佈模式下調試以查看最新失敗?

class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     try 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new MainWindow()); 
     } 
     catch (Exception ex) 
     { 
      Logger.Error("Main : "+ex.Message, typeof(Program)); 
      MessageBox.Show(ex.Message + ex.StackTrace); 
      Environment.Exit(1); 
     } 
    } 
} 

回答

7

您的代碼段中的catch子句將永遠不會收到您應用的發貨版本中的任何內容。它工作,當你運行一個附加調試器。

你缺少的是Application.ThreadException的行爲方式。只要檢測到未處理的異常,該事件就會觸發。但是,此功能在調試代碼時啓用了而不是。沒有安裝異常處理程序來引發事件。這樣做是爲了讓你有一個體面的方法來調試未處理的異常。你的代碼改變了這種行爲,現在 try block active,你的catch處理程序得到異常。

要讓代碼行爲相同,您需要更改未處理的異常處理策略。像這樣:

[STAThread] 
    static void Main() { 
     try { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException); 
      Application.Run(new Form1()); 
     } 
     catch (Exception ex) { 
      // etc.. 
     } 
    } 

現在你的catch子句總是會發現異常。只要在主線程中引發它,它就不會捕獲工作線程中引發的異常。考慮這個代碼,而不是統一處理:

[STAThread] 
    static void Main() { 
     AppDomain.CurrentDomain.UnhandledException += AllUnhandledExceptions; 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException); 
     Application.Run(new Form1()); 
    } 

    private static void AllUnhandledExceptions(object sender, UnhandledExceptionEventArgs e) { 
     var ex = (Exception)e.ExceptionObject; 
     // Display or log ex.ToString() 
     //... 
     Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(ex)); 
    } 
+0

感謝您的寶貴意見 – armin

+0

這是WPF還是Windows窗體? –

2

很多原因,它可能發生,而許多專業人士可以證實,這是一個經典的錯誤任何應用程序,當你確定一切wrks精細出現,但客戶機上不起作用。

這很難說出爲什麼會發生這個問題,而沒有提供任何異常的細節。

順便說一句,您可以通過從Visual Studio附加到它來調試您的應用程序。

How to: Attach to a Running Process

+0

謝謝您的回答,但你能解釋一下爲什麼我上面的代碼甚至沒有趕上這個例外,它只是崩潰,沒有例外,沒有任何提示消息框或任何 – armin

+0

@armin什麼呢? EventViewer說? –

+1

好吧,有些類型的例外不能被'try/catch'所懲罰,例如'StackOverflow'。像LB建議的那樣查看'EventViewer',或[Enable First Chance Exceptions](http://florianreischl.blogspot.it/2010/01/how-to-enable-first-chance-exceptions.html)來查看哪裏和哪裏怎麼了。 – Tigran

0

調試和發佈模式是兩種不同的方式來構建你的代碼。由於幾乎每種開發環境的具體方式都不盡相同,因此無法立即告知。模式也可以稱爲模式1 &模式2。

但是,您的調試模式可能會將調試信息(符號表,行編號等)編譯到您的二進制文件中,而發行版不包含這些信息。但是可能會有數千種不同。

嘗試找到調試/發佈模式指定的位置,您會發現不同之處!

0

找到任何環境選項的最佳方法是記錄生產中發生了什麼。首先捕獲並記錄異常,然後使用您學習的更具體的日誌記錄。

查看this Microsoft kb article的說明。

至於後面的發佈和調試模式的想法:

釋放模式和調試模式存在允許不同的配置,一個設計來幫助開發人員發現bug外,其他以優化性能,並配置生產環境。

瞭解差異的最好方法是簡單地調出項目的構建屬性(右鍵單擊您的項目,選擇Properties,然後單擊左側的Build選項卡)。查看基於配置可以更改的所有不同選項。

調試與發佈的另一個常見問題不是在您的某個項目項目(例如配置文件或嵌入式資源)上設置正確的構建操作

2

我的經驗告訴我你應該在你處理任何類型的設置的地方尋找代碼。

您可以通過在註冊表中沒有設置並在application.config中沒有設置來調試應用程序來開始。

如果您的應用程序使用數據庫,您也應該使用空數據庫來嘗試。

第二步是在您同事的計算機上調試您的應用程序。

希望這會幫助你的追求。

相關問題