LeakDiag是微軟一款檢測(cè)內(nèi)存泄漏的工具,可以用來精確地找到內(nèi)存泄露一直到代碼行。它使用微軟的Detours 技術(shù),攔截指定內(nèi)存分配的調(diào)用并跟蹤各種調(diào)用棧,并報(bào)告已分配但尚未釋放的內(nèi)存,這一信息允許讓我們?cè)谂懦粋(gè)內(nèi)存泄露問題時(shí),能精確查看哪些組件進(jìn)行了該分配。使用正確的調(diào)試符號(hào),我們甚至可以看見請(qǐng)求分配的代碼行。使用C或者C++編程的時(shí)候,最擔(dān)心的應(yīng)該還是內(nèi)存泄漏問題,測(cè)試人員通常專注于功能/性能測(cè)試,如果有不明顯的內(nèi)存泄漏,可能要在程序發(fā)布后幾天,甚至更久才會(huì)發(fā)現(xiàn)故障。因此,檢查C/C++程序的內(nèi)存泄漏,開發(fā)人員需要自己把好這個(gè)關(guān)。
檢測(cè)內(nèi)存泄漏的工具有很多,大致分為二種,一種是嵌入程序的,需要修改源碼;一種是attach到進(jìn)程,實(shí)時(shí)監(jiān)測(cè)的。
LeakDiag是微軟的一款內(nèi)存泄漏檢測(cè)工具,免費(fèi)的,不需要和待檢測(cè)的源程序一起編譯,在使用上較為方便,能夠統(tǒng)計(jì)一段時(shí)間內(nèi)的內(nèi)存泄漏大小以及指出發(fā)生內(nèi)存泄漏的源代碼的行數(shù)。
安裝時(shí)候需要注意:務(wù)必按照默認(rèn)路徑安裝,否則可能出問題。
LeakDiag支持5種不同的分配:
1) 虛擬分配。 這種分配可追蹤用VirtualAlloc/ VirtualAllocEx 等關(guān)于虛擬內(nèi)存分配的內(nèi)存。此時(shí),選擇LeakDiag 上[Memory allocators] 選項(xiàng)的“Virtual Memory Allocator”來檢測(cè)。
2) 堆分配。這種分配可追蹤NTDLL.DLL中如下函數(shù)分配的內(nèi)存。
· RtlCreateHeap,
· RtlDestroyHeap,
· RtlAllocateHeap,
· RtlFreeHeap,
· RtlReAllocateHeap,
· LocalReAlloc,
· LocalFree,
· LocalAlloc,
· LocalReAlloc,
· GlobalAlloc,
· GlobalReAlloc and
· GlobalFree
此時(shí),選擇LeakDiag 上[Memory allocators] 選項(xiàng)的“Windows Heap Allocator”來檢測(cè)。
3) 線程局部存儲(chǔ)(Thread Local Storage,TLS指允許一個(gè)進(jìn)程的多個(gè)線程存儲(chǔ)每個(gè)線程所獨(dú)有的數(shù)據(jù)的一種Win32 機(jī)制)分配。這種分配可追蹤MSDART32.DLL中如下函數(shù)分配的內(nèi)存。
· MPHeapAlloc,
· MPHeapFree and
· MPHeapReAlloc
此時(shí),選擇LeakDiag 上[Memory allocators] 選項(xiàng)的“MPHeap Allocator”來檢測(cè)。
4) COM分配(外部和內(nèi)部)。這種分配可追蹤OLE32.DLL,OLEAUT32.DLL 中如下函數(shù)分配的內(nèi)存。
· CoGetMalloc,
· CoTaskMemAlloc,
· CoTaskMemFree,
· CoTaskMemRealloc,
· CRetailMalloc_Alloc,
· CRetailMalloc_Free,
· CRetailMalloc_Realloc,
· SysAllocStringLen,
· SysAllocStringByteLen,
· SysAllocString,
· SysFreeString,
· SysReAllocString and
· SysReAllocStringLen
此時(shí),選擇LeakDiag 上[Memory allocators] 選項(xiàng)的“COM Allocator”或“COM Internal Allocator”來檢測(cè)。
5) C運(yùn)行時(shí)分配。這種分配可追蹤MSVCRT.DLL中如下函數(shù)分配的內(nèi)存。
· malloc,
· calloc,
· realloc,
· free,
· new,
· new[],
· delete and
· delete[]
此時(shí),選擇LeakDiag 上[Memory allocators] 選項(xiàng)的“C Runtime Allocator”來檢測(cè)。