2012-06-08 39 views
1

我們有一個運行在WPF和Entity Framework之上的大型商業應用程序。問題是我們在過去的兩週內遇到問題,無法確定它的來源。如何從異常中獲取更多信息(隨機發生的C#WPF)?

異常正被困DispatcherUnhandledException,我們從異常(通過電子郵件)獲得的信息是這樣的:

mscorlib: Value cannot be null. 
    at System.Threading.Monitor.ReliableEnter(Object obj, Boolean& lockTaken) 
    at System.Threading.Monitor.Enter(Object obj, Boolean& lockTaken) 
    at System.Data.EntityClient.EntityConnection.ChangeConnectionString(String newConnectionString) 
    at System.Data.EntityClient.EntityConnection.Dispose(Boolean disposing) 
    at System.ComponentModel.Component.Finalize() 

的異常被拋出「隨機」 4或5倍,每天只有來自我們擁有的20多個用戶中的一個。我們無法弄清楚問題所在!堆棧跟蹤沒有提供太多的信息,我們也無法重現問題。

我想這是一個線程發生的事情,但我不能確定線程導致異常,因爲我們有很多BackgroundWorkers和異步的東西!

那麼,我怎樣才能獲得有關異常的更多信息?


編輯:

沒有任何InnerExceptions。

此外,異常正在以分鐘爲間隔,然後小時拋出例如在:11時41分,11點46分,然後十一點51運行細直到18:03,18:07,18點11然後沒有例外拋出。這個分鐘間隔發生的時刻也是隨機的,與服務器或網絡上的任何負載無關。

+3

是否有'InnerException'不通過電子郵件傳遞? –

+0

不,所有捕獲到的異常都會隨其InnerExceptions一起發送(如果有的話)。 –

+0

您的代碼中某處可能存在異常,並被框架中的某些回調隱藏。嘗試添加記錄異常的catch子句然後拋出;他們回到與WPF的聯繫點(例如在VM setter中,在命令實現中)。另外,如果可能的話,發送該客戶端匹配的PDB並嘗試遠程調試(使用Visual Studio遠程調試器)。 –

回答

3

看起來這可能是垃圾收集線程的一部分。在堆棧底部的Finalize調用是提示,然後這可能調用EntityConnection.Dispose(false);

問題的性質是非確定性的。現在正在發生的事情可能在您的環境中發生了變化。

在終結器中,訪問其他託管對象確實是不安全的。它看起來像ChangeConnectionString可能試圖使用一個託管對象作爲鎖,有時當它在GC線程中的對象已被清理。它這樣做可能是EntityConnection中的一個錯誤。

您應該能夠通過調用Dispose在你的組件,而不是讓終結得到運行,以避免這種(使用塊括起來是保證這個偉大的方式)。儘管你有過這個callstack,但很難說引起這個問題的Component的本質。

如果你想得到一個本地repro,試着使用覆蓋Finalize(例如〜MyComponent())的類來訪問正在訪問EntityConnections的Component對象,並在其中拋出Exception。這樣,如果GC能夠清理那些對象,就會發生崩潰。

+0

我們在所有的EF連接中都使用了''''子句。我現在正在進行遠程調試,我以前從未使用它,它看起來很有前途。感謝您的回答。我會更新此線程與更多信息時可用。 –

1

的「ReliableEnter值不能爲空」錯誤意味着您要鎖定其設置爲null的對象上。

找到對象被設置爲null的位置。

相關問題