使用 VLD 記憶體漏失檢測工具輔助開發時整理的學習筆記。
在 QT 中使用 VLD 的方法可以檢視另外幾篇部落格:
本次測試使用的環境為:QT 5.9.2,Debug 模式,VLD 版本為 2.5.1,VLD 組態檔不做任何更改使用預設設定,測試工程所在路徑為:E:\Cworkspace\Qt 5.9\QtDemo\testVLD
。
寫一個有一處記憶體漏失的程式,如下:
#include <QCoreApplication>
#include "vld.h"
void testFun()
{
int *ptr = new int(0x55345678);
printf("ptr = %08x, *ptr = %08x", ptr, *ptr);
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
testFun();
return a.exec();
}
使用 MSVC 2015 32bit 編譯器,程式執行時,在標準輸出窗會輸出以下結果:
ptr = 0070a3d0, *ptr = 55345678
程式執行結束後,檢測到了記憶體漏失,VLD 會輸出以下報告(本例中出現一處記憶體漏失),第 1~3 行顯示 VLD 執行狀態,第 4~21 行顯示洩漏記憶體的詳細資訊,第 22~24 行總結此次洩漏情況,第 25 行顯示 VLD 退出狀態。
Visual Leak Detector read settings from: D:\Program Files (x86)\Visual Leak Detector\vld.ini
Visual Leak Detector Version 2.5.1 installed.
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 1 at 0x0070A3D0: 4 bytes ----------
Leak Hash: 0xA7ED883D, Count: 1, Total 4 bytes
Call Stack (TID 20672):
ucrtbased.dll!malloc()
f:\dd\vctools\crt\vcstartup\src\heap\new_scalar.cpp (19): testVLD.exe!operator new() + 0x9 bytes
e:\cworkspace\qt 5.9\qtdemo\testvld\main.cpp (6): testVLD.exe!testFun() + 0x7 bytes
e:\cworkspace\qt 5.9\qtdemo\testvld\main.cpp (16): testVLD.exe!main()
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (74): testVLD.exe!invoke_main() + 0x1B bytes
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (264): testVLD.exe!__scrt_common_main_seh() + 0x5 bytes
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (309): testVLD.exe!__scrt_common_main()
f:\dd\vctools\crt\vcstartup\src\startup\exe_main.cpp (17): testVLD.exe!mainCRTStartup()
KERNEL32.DLL!BaseThreadInitThunk() + 0x19 bytes
ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0x11E bytes
ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xEE bytes
Data:
78 56 34 55 xV4U.... ........
Visual Leak Detector detected 1 memory leak (40 bytes).
Largest number used: 40 bytes.
Total allocations: 40 bytes.
Visual Leak Detector is now exiting.
使用 MSVC 2015 64bit 編譯器,程式執行時,在標準輸出窗會輸出以下結果:
ptr = 25a42da0, *ptr = 55345678
程式執行結束後,檢測到了記憶體漏失,VLD 會輸出以下報告(本例中出現一處記憶體漏失),第 1~3 行顯示 VLD 執行狀態,第 4~21 行顯示洩漏記憶體的詳細資訊,第 22~24 行總結此次洩漏情況,第 25 行顯示 VLD 退出狀態。
Visual Leak Detector read settings from: D:\Program Files (x86)\Visual Leak Detector\vld.ini
Visual Leak Detector Version 2.5.1 installed.
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 1 at 0x0000000025A42DA0: 4 bytes ----------
Leak Hash: 0x92ED96C9, Count: 1, Total 4 bytes
Call Stack (TID 16444):
ucrtbased.dll!malloc()
f:\dd\vctools\crt\vcstartup\src\heap\new_scalar.cpp (19): testVLD.exe!operator new() + 0xA bytes
e:\cworkspace\qt 5.9\qtdemo\testvld\main.cpp (6): testVLD.exe!testFun() + 0xA bytes
e:\cworkspace\qt 5.9\qtdemo\testvld\main.cpp (16): testVLD.exe!main()
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (75): testVLD.exe!invoke_main()
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (264): testVLD.exe!__scrt_common_main_seh() + 0x5 bytes
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (309): testVLD.exe!__scrt_common_main()
f:\dd\vctools\crt\vcstartup\src\startup\exe_main.cpp (17): testVLD.exe!mainCRTStartup()
KERNEL32.DLL!BaseThreadInitThunk() + 0x14 bytes
ntdll.dll!RtlUserThreadStart() + 0x21 bytes
Data:
78 56 34 55 xV4U.... ........
Visual Leak Detector detected 1 memory leak (56 bytes).
Largest number used: 56 bytes.
Total allocations: 56 bytes.
Visual Leak Detector is now exiting.
使用不同位數的編譯器時,輸出報告的差異主要體現在以下幾點:
0x0070A3D0
和 0x0000000025A42DA0
。Windows
作業系統函數不完全相同,32 bit 編譯器呼叫了兩次 RtlGetAppContainerNamedObjectPath()
函數和一次 BaseThreadInitThunk()
函數,64 bit 編譯器只呼叫了一次 RtlUserThreadStart()
函數和一次 BaseThreadInitThunk()
函數,且它們呼叫 BaseThreadInitThunk()
函數時洩漏指令的記憶體偏移量不同,32 bit 編譯器是 0x19 bytes
,而 64 bit 編譯器是 0x14 bytes
。36 bytes
,64 bit 編譯器時是 52 bytes
。體現在輸出的倒數第二行,分別為 Total allocations: 40 bytes
和 Total allocations: 56 bytes
,將程式碼請求的記憶體大小 4 bytes
加上各自管理頭的記憶體大小,可以得到與輸出一致的結果: \(4 + 36 = 40bytes\) 及 \(4 + 52 = 56bytes\)。本文作者:木三百川
本文連結:https://www.cnblogs.com/young520/p/17260261.html
版權宣告:本文系博主原創文章,著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請附上出處連結。遵循 署名-非商業性使用-相同方式共用 4.0 國際版 (CC BY-NC-SA 4.0) 版權協定。