2009-02-24 18 views
0

我有一個Animal基類,我在一些模擬程序中使用。在這種情況下,運行中可能會多達500個Animal。每次運行都設置爲讓每個Animal每個「時間步」執行一些操作。因此,我只是循環列出動物列表,每個動物列表都要撥打DoTimeStep,直到所有時間步驟完成。如何在C#中調試不一致的空引用?

每個Animal類都有自己的記錄器類來爲仿真中的每個「時間步長」寫出數據。這樣每個Animal都有自己的日誌文件。它運行良好(3年),直到我們試圖在虛擬機上運行它。然後,無論什麼原因,每隔一段時間,記錄器引用將爲「時間步長」爲空,然後下一次它將在那裏。奇怪的部分是記錄器內部的StreamWriter似乎永遠不會失去其文件的位置。它只是跳過寫出該行的時間步驟。錯誤日誌在Logger類上顯示NullReferenceException

我找不到這種行爲的任何模式。 Animal類未被銷燬並重新創建。記錄器在Animal構造函數中創建,並在IDispose中銷燬。關於如何開始調試此問題的任何想法?

編輯:我可以重新創建只有3只動物,所以500個打開的文件不應該是它。但謝謝你的嘗試。

編輯:我不知道我應該做什麼,當我趕上空例外的錯誤。我已經抓住了它,但我無法弄清楚如何找出它發生的原因。對不起,看起來很鈍。順便說一句,我嘗試了Thread.Sleep(300)10000循環,看看是否有某種比賽正在進行,我沒有意識到。它在循環中永遠不會變爲空。但是3秒鐘後,當我通過其他兩隻動物循環後回來,它不再爲零。

+0

你在使用什麼虛擬機?我們能否看到引發異常的記錄器代碼? – 2009-02-25 04:17:19

回答

0

是否有機會遇到多線程問題,可能與延遲初始化有關?

2

聽起來像一個競爭條件...你是否正確鎖定線程之間共享的數據?

編輯:如果它不是一個競爭條件,我的秒猜測可能是虛擬機不喜歡同時打開500個文件......你看過嗎?

+0

虛擬機不允許打開500個文件的有趣點。 – 2009-02-24 18:52:59

5

我會做以下事情。

  1. 安裝VS調試器下運行程序
  2. 啓用一個空引用異常
  3. 調試器第一次機會異常 - >例外 - >展開公共語言運行庫 - >檢查拋出System.NullReferenceException
  4. 如果它需要很長的時間來瑞普
  5. 啓動程序
  6. 等待

我將開始它回家FO晚上。它會在早上等着你;)

0

聽起來像是一種競爭條件。我已經想出瞭解決這種問題的最簡單的修補程序修復程序:

找到正在分配null變量的位置。無論它得到的數據是偶爾提供null,對吧?

因此,檢查在那裏,如果返回null,睡眠對於像300毫秒,然後再試,直到它的非空。

如果超過,比如說10秒鐘,這兩點失敗,挽救一個錯誤。不要讓它繼續處於無效狀態。

0

這可能是一些涉及到虛擬機......我也有類似的內存問題與VMWare與在無緣無故的所有內存被弄亂了原生的C++應用程序,並說他們沒有做任何的虛擬機......(我們都知道這意味着他們正在爲虛擬機做些什麼)

我看到了當虛擬機被主動從一臺服務器移動到另一臺服務器時沒有關閉的奇怪行爲(它基本上重複幾個字節的代碼兩次導致各種有趣的錯誤,特別是如果資源先關閉的話)。

但無論如何,如果它只能在VM上重現,我會嘗試使用專用資源(不共享或部分處理器或任何其他)使用專用資源在開發VM服務器上隔離它,並查看是否可以重現它。然後從那裏開始......重新添加相同類型的環境,直到您可以重現它爲止。

相關問題