2013-06-28 19 views
1

我們的C#.NET應用程序遇到「OutOfMemoryException」。它們出現在隨機函數調用中,通常需要繪製圖像(System.Drawing.Image.get_RawFormat)或需要創建線程(System.Threading.Thread.StartInternal)。神祕的「Section Handle」內存泄漏(C#.NET/WinForms)

不用說,我無法重現我的開發機器上的崩潰。我獲得了崩潰應用程序的堆快照,並使用Process Explorer查看了另一個崩潰的實例。

例如,在一個實例中,有380M堆RAM(看起來OK),7758個句柄(看起來相當高),2245個USER-和1798個GDI對象)。

使用漂亮的軟件「Process Hacker」,我能夠獲得「句柄類型直方圖」。這顯示了4181個「Section」句柄,2834個「Event」句柄和420個「Thread」句柄。 「部分」處理數量遠遠高於我在開發機器上找到的數量。

我回顧了「What can cause section handle leaks?」的問題,但不幸的是答案並沒有幫助我。我們不使用內存映射文件或IPC(至少不是直接),並且我們不使用本文中提到的函數。

我試圖記憶配置文件的應用程序,但沒有發現任何明顯或重大的內存泄漏。我在運行GC並打印內存信息/處理計數的應用程序中添加了一個鉤子,但即使在生產環境中,使用此熱鍵我也無法重現泄漏。

我們使用的第三方軟件可能會導致一些問題(DevExpress控件和其他組件)。

此刻,我很無助,想問你的意見。我可以查看或檢查什麼?我如何着手追蹤問題?謝謝你的幫助!

+0

我知道在這裏問可能已經太遲了,但是在這方面有什麼進展?我的問題和你的一樣。 – Shawn

回答

1

對於這樣的情況,有效的方法是開始評論重複邏輯的各個部分。首先刪除大部分內容,然後檢查泄漏情況。如果泄漏消失,則開始逐個取消註釋代碼,直到泄漏再次開始。這很煩人,但它確實可以幫助你在其他選項不存在的時候確定罪魁禍首。