让Visual Leak Detector使用最新10.0版本的dbghelp.dll
让Visual Leak Detector使用最新10.0版本的dbghelp.dll
介绍
VLD(Visual Leak Detector)是一个检测Windows C++程序内存泄漏的老牌神器,但好几年没维护了。
网址:https://github.com/KindDragon/vld/
需求
这个工具通过SxS manifest绑定了只能使用它工程目录下自带的dbghelp.dll来处理pdb符号,版本是6.11.1.404。
这个版本目前比较老了,所以在解析VS2019/VS2022生成的pdb文件时,有时候会崩掉或者无法解析出调用栈的符号,导致无法报出来完整的内存泄漏,影响基本功能。所以需要升级它所使用的dbghelp.dll。
VLD的实现机制
在首次进入vld_x64.dll的PE入口时,inline hook掉ntdll.dll的LdrpCallInitRoutine()函数,因为此时可以假定vld_x64.dll是被ntdll.dll的LdrpCallInitRoutine()函数调用的。
这样后续ntdll.dll调用当前进程中的任何dll的入口函数时,都会先调用vld_x64.dll提供的一个LdrpCallInitRoutine() hook函数。
完成hook后,会执行vld_x64.dll中的各个全局对象的构造。vld_x64.dll提供了一个全局对象g_vld,这个对象的构造函数会调用dbghelp.dll的SymInitializeW()来初始化MS的符号库函数。
__declspec(dllexport) VisualLeakDetector g_vld;