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