2010-04-12 78 views
4

我試圖找到一個重大的內存泄漏(一次15MB,但在多個地方做這樣的分配)。我檢查了最明顯的地方,然後使用了AQTime,但我仍然無法找到它。現在我看到左邊2種選擇:使大內存分配過程崩潰

1)使用SetProcessWorkingSetSize:我試過,但我高興地過程中使用了更多的則150MB當運行保持:分配更多的時候

DWORD MemorySize = 150*1024*1024; 
SetProcessWorkingSetSize(GetCurrentProcess(), MemorySize/2, MemorySize*2); 

2)把一個斷點然後一次1MB。我該如何做到這一點,超載運算符新的'如果> 1MB'在裏面?

+2

你在哪裏得到15MB號碼?操作系統聲稱你的進程使用了​​多少空間?很多時候標準庫會分配比您請求的更多的內存,並保留下一個新的內存。例如,1000個15K的分配仍然可能顯示爲一次泄漏15MB。 – 2010-04-12 17:32:28

回答

0

對不起,所有建議的解決方案都不起作用。它最終使用AQTime和大量的調試輸出來修復。在關機時泄漏得到了清理,因此它在乾草堆中尋找針。

儘管如此,我仍然對如何有效地找到它感興趣。我試圖在新運算符上放置一個條件斷點,但調試器花了很長時間來評估每個單獨分配的「字節> 1024 * 1024」。

1

SetProcessWorkingSetSize並不意味着你認爲這意味着什麼 - 它是操作系統有關在內存中保留多少內存而不是分頁到磁盤的線索。現代操作系統在將未使用的內存分頁到磁盤時非常積極 - Windows尤其如此。

IBM Rational Purify是您唯一的解決方案,而不是非常徹底的代碼分析。在Windows上,對於C/C++,沒有更好的工具來查找內存泄漏。在Mac或Linux上,您可以使用valgrind,但AFAIK,它尚未在Windows上工作。

0

1)使用SetProcessWorkingSetSize:我試過,但我高興地過程中使用了更多的則150MB當運行保持:

什麼是SetProcessWorkingSetSize回來?通話是否成功?

2)一次分配多於1MB時放置一個斷點。我該如何做到這一點,超載運算符新的'如果> 1MB'在裏面?
是的,這應該工作。

檢查由MSVC提供的C Runtime Debug Heap提供的工具可能很有幫助。

+0

SetProcessWorkingSetSize成功,它返回非零值 – Pieter 2010-04-12 17:12:44

0

在嵌入式系統上,我們會按照您的建議完成 - 在任何超過特定閾值的new/memAlloc調用中休息一下,並在free/delete上執行相同的操作。單調乏味,但它會完成工作。大小的條件斷點應該做你想要的,但是在刪除時,它會更糟糕。

0

嘗試使用UMDH。這是一個免費的微軟工具,可以查找內存泄漏。

1

從你的標籤你正在使用c + +和visual studio。

在這種情況下,您可以簡單地使用Microssoft爲您提供的crt調試掛鉤。

搜索msdn for _CrtSetAllocHook。

在調試版本中,這將允許您截取每一個分配 - 您可以忽略小分支,只需在大分支上設置一個斷點或調用:: DebugBreak即可。