一个内存分配钩子函数需要具有如下的定义:
int AllocHook(int allocType, void*userData, size_t size,int blockType, long requestNumber, onst unsigned char*filename, int lineNumber);
该函数需要在VLD初始化时被注册,每次从堆中分配内存前被调用,它需要处理的事情就是记录下此时的调用堆栈和此时堆内存分配的唯一标识requestNumber。
得到当前堆栈的二进制表示并不是很复杂的事情,但是因为不同的体系结构、不同的编译器、不同的操作系统所产生的堆栈内容是不一样的,要解释堆栈并得到整个函数的调用过程比较复杂。不过Windows提供了一个StackWalk64函数可以获得堆栈的内容。
VLD是常用的C/C++内存泄漏检查工具,可以在ViusalC++中使用,在Viusal Studio 2008和2010中使用需要注意两点:
1) 版本问题:VLD已经更新到2.2版本,修正了许多bug,而且在2010版本下工作良好,VisualC++ 6.0推荐使用1.0版本,1.9b版本不是很稳定不建议使用,2.2版本的下载网址为http://vld.codeplex.com.
2) 设置变化:VC++Directories设置已经变化位置,在2010中设置过程如下:
View | Other Window | Property Manager
Go to "VC++ Directories" settings
Set include folder path
Set lib folder path
点OK,我们就设置好了include和lib目录。
使用问题
问题1:VLD 1.9
在vista下使用vld的使用,总是出现错误无法正常工作,后来经过搜索,在http://www.codeproject.com/KB/applications/visualleakdetector.aspx
上的评论中找到了解决的方法:
评论“Solution forrunning 1.9 beta on Visual Studio 2008 with Vista ”给出了解决方法:
评论1:
VLD keptcrashing when trying to use 1.9g beta on Windows Vista, visual studio 2008. Itried all the suggestions on here and nothing worked. But I finally figured itout.
when you make a project in visual C++ 2008,it sets some strange advanced Linker properties that cause VLD to crash:
I changedLinker->Advanced->Randomized Base Address from Enable Image Randomization(/DYNAMICBASE) to Disable Image Randomization (/DYNAMICBASE:NO)
Then I changed Linker->Advanced->DataExecution Prevention from Image is compatible with DEP (/NXCOMPAT) to Default
And now it works perfectly
Please let me know if this helped you!It'll make me feel better for spending a whole day trying to get it working!
-Nadav
评论2:
The base address randomization seems to benot necessary. Just disable DEP.
大致的意思是说,只需要禁用DEP即可,
在工程的“属性”->“链接器”->“高级”->数据执行保护(DEP),设为“默认”(default)或者“映像与 DEP 不兼容(/NXCOMPAT:NO)“ 即可。(修改后好像不可用)。
注:这个选项只针对Vista有效!!!