2011-05-07 32 views
4

我有一個Windows服務應用程序,WinXPe,有時因錯誤而失敗,並顯示一個消息框,用戶下運行:如何完全捕獲所有異常/錯誤

「的指令‘’ 在「00000000」中所引用的內存。該 內存不能爲「read」。按OK 退出程序

如果用戶點擊「確定」服務正在重新啓動。

我試圖捕獲所有未處理的異常,並在處理程序中註冊一個事件處理程序AppDomain.CurrentDomain.UnhandledException 我登錄異常詳細信息並退出應用程序。 但我上面提到的錯誤不是從「UnhandledException」處理的。

該應用程序嚴重多線程,使用System.Threading.Timer和System.Threading.Thread。它使用一些第三方庫,其中一個庫使用本地互操作,我沒有本地庫的來源。

我試圖用附加的調試器指出錯誤,但錯誤不顯示;) 應用程序必須在發生錯誤前幾天運行。

我需要一種方法來處理這樣的錯誤。

謝謝

+0

馬蒂是正確的,這不是一個託管的異常,所以你平時的調試技術將無法正常工作。你使用P/Invoke來調用任何本地方法嗎?您是否使用任何以非託管代碼編寫的第三方庫?我們真的需要更多細節才能解決這個問題。如果您想自己嘗試調試問題,則必須啓用本地代碼調試。 – 2011-05-07 09:20:54

+0

我沒有辦法修復本地庫中的任何東西。我沒有消息來源。它是基於PC的PLC「TwinCat」的一個組件。必須有一些辦法來處理這個:( – chriszero 2011-05-07 09:30:26

+0

我想[我的選擇](http:// stackoverflow。com/questions/5920154/how-to-catch-absolutely-all-exceptions-errors/5920184#5920184)應該可以正常工作** [使用單獨的AppDomain](http://msdn.microsoft.com/en-us/庫/ system.appdomain.load.aspx)**。對於絕對隔離,請使用[.NET Remoting](http://msdn.microsoft.com/zh-cn/library/kwdt6w2k(v = vs.71).aspx)從單獨的進程使用本機庫。另一個明顯的道路是向[庫創建者/維護者]報告一個錯誤(http://www.beckhoff.com/english/support/default.htm)_ – sehe 2011-05-07 10:01:31

回答

3

Vectored Exception Handling

這是(Structured Exception Handling)窗口SEH的一部分,IIRC這裏要說的是,你不能,至少可以在這樣的情況下,通知的珍貴的幾個誤區。

可能要直接寫任何處理代碼到本地的Win32 API(不安全/非託管代碼),只有使用預分配(靜態?)緩衝區,因爲會有很多東西不可靠的在那一刻及時。

注意/遠離線程,鎖定原語,內存分配,磁盤IO;最好使用Windows默認的API,例如重新啓動進程或產生一個小型轉儲和類似的東西

+0

我假設你錯過了用.NET Framework編寫C#程序的部分? – 2011-05-07 09:22:31

+0

@Cody:我假設你錯過了這個問題本身?如果這不是問題,那就沒有問題了。也''它使用一些第三方庫,其中一個庫使用本地互操作「' – sehe 2011-05-07 09:26:46

+0

但由於我無法訪問本地源,我想我不能應用這個。或者我錯過了什麼? – chriszero 2011-05-07 10:16:33

3

該錯誤不是託管異常。這是較低級別的內存訪問衝突。本質上是本地代碼中的NULL指針訪問。

這是你應該從託管代碼中完全保護的東西,所以它可能是你的本地庫或你使用它們的方式之一。如果錯誤僅在執行幾天後纔出現,那麼您可能最好先通過任何本機庫調用,檢查其簽名並確保將有意義的數據傳遞給它們。

+0

是的。但是如果你可以在某處使用非託管代碼,你仍然可以擁有這個。許多具有非託管代碼(依賴性)的庫以及插件/ IoC習慣用語的興起,諷刺地說,這種「問題」受到管理平臺崛起的諷刺。如果您對可靠性/安全性有任何擔憂,您應始終在您的應用程序中要求所有加載的程序集都是強名稱,可驗證的並且不要求完全信任。只有這樣,我纔會謹慎地同意Matti的陳述,您不需要擔心這樣的事情 – sehe 2011-05-07 09:23:21

+0

但是我必須處理這些選項? – chriszero 2011-05-07 09:37:40

+0

@chriszero:我......我們不得不等待一個知道Windows更好的人。 – 2011-05-07 09:39:18