我試圖追查當我強調我的C#代碼並在低內存條件下運行時發生的崩潰。但是,在某些情況下,我的程序只會崩潰並退出,而不是發生OutOfMemoryException。這通常是由於溢出緩衝區或堆棧溢出(或損壞)導致的內存損壞引起的。在C#中檢查堆完整性和堆棧大小
那麼,有沒有辦法檢查堆的完整性,還是有辦法檢查一個線程剩下多少堆棧?
爲了速度的原因,我使用了很多不安全的代碼,所以很可能我的代碼在某處破壞了內存。不幸的是,在腐敗發生後,崩潰發生在隨機間隔。我知道C#會在檢測到緩衝區溢出時關閉應用程序,但有沒有辦法強制它執行檢查?
謝謝。
它沒有顯示任何異常而退出嗎?您是否嘗試過在發行版和調試模式下進行編譯和測試?你想要的是一個對話框,告訴你如何「未處理的異常」或「分段錯誤」或類似的東西,給你一個線索。 – csl 2009-10-28 15:29:41
是的,它只是沒有任何例外而退出。我已經在發佈和調試模式下進行了測試。沒有不同。您可以通過使用stackalloc從堆棧中請求更多內存然後實際上可用,從而獲得類似的崩潰。也就是說,你不會遇到堆棧溢出異常,程序就會退出。 請注意,這種崩潰只發生在內存不足的情況下。所以也許這畢竟不是腐敗。也許像JIT這樣的內存耗盡並導致退出。 – AZDean 2009-10-28 16:57:46
另外請注意,我必須關閉虛擬內存的自動調整來強制內存不足的情況。換句話說,我真的強迫它耗盡內存。 我在閱讀有關「受限制的執行區域」,但我不明白這對我有何幫助。這個問題使我的程序在代碼中不可預知的地方崩潰,到處都是。我無法讓我的整個計劃成爲CER。 – AZDean 2009-10-28 16:58:42