我有一個計算開銷很大的多線程C#應用程序,運行30-90分鐘後似乎一直崩潰。它給出的錯誤是我在JIT/CLR中發現了一個錯誤 - 現在我該如何調試或複製它?
運行時遇到致命錯誤。錯誤的地址是0xec37ebae,線程0xbcc。錯誤代碼是0xc0000005。此錯誤可能是CLR中的錯誤,也可能是用戶代碼中不安全或不可驗證的部分。此錯誤的常見來源包括COM-interop或PInvoke的用戶編組錯誤,這可能會破壞堆棧。
(0000005是Access Violation錯誤代碼)
我的應用程序不調用任何本地代碼,或使用任何不安全塊,甚至是任何非CLS兼容類型,如uint
。事實上,代碼調試器說行導致崩潰的原因是
overallLength += distanceTravelled;
如果雙方的值類型的double
考慮到這一切,我相信碰撞必定是由於錯誤在編譯器或CLR或JIT中。我想弄清楚是什麼原因造成的,或者至少寫一個更小的複製品發送到微軟,但我不知道從哪裏開始。我從來沒有查看CIL二進制文件,或編譯的JIT輸出,或本地堆棧跟蹤(在崩潰時沒有託管堆棧跟蹤),所以我不知道如何。我甚至無法弄清楚如何在崩潰時查看所有變量的狀態(不幸的是,在託管異常之後,VS不會告訴我它喜歡它,並將它們輸出到控制檯/文件會減慢該應用程序1000倍,這顯然不是一種選擇)。
那麼,我該如何去調試呢?
[編輯]下,VS 2010 SP1編譯,運行最新版本的.NET 4.0客戶端配置文件的。顯然,這是」。NET 4.0℃/ .NET 4.0E,.NET CLR 1.1.4322"
您確定這不是您計算機上的內存問題嗎?我發現當指針被破壞並設置爲無效的內存位置時,其他程序中會出現相同的錯誤代碼。 – Matthew
@Matthew:我將運行一些內存測試,並嘗試在另一臺機器上重現它。但我懷疑 - 這個程序不是非常耗費內存,我也沒有任何其他程序的問題。而且,它總是在同一條線上崩潰。 –
我對CLR並不熟悉,但在Sun JVM上有一個標誌,它會記錄所有已編譯的方法 - 如果您可以確定(1)JIT是否被調用,以及(2)多長時間事故發生後。可能有一個工具可以讓你檢查內存映射,找出在那個地址加載了什麼(甚至是否在代碼塊中)。 – parsifal