原文地址http://blog.csdn.net/xdkui/archive/2008/12/19/3560143.aspx
(感谢作者,这篇文章太有用了)
最近在论坛里看到很多人问怎样检查内存泄漏,对于Windows CE/Windows Mobile开发,微软已经为我们提供了很好的工具Application Verifier。AppVerifier是一个辅助开发工具,不用修改代码,可以检测出程序内存,句柄, GDI对象泄漏,并报告分配泄漏对象的调用栈,有过在大规模代码里查资源泄漏的兄弟应该知道这个调用栈的价值。
在中文google里搜了下,没有发现讲这个工具使用的文章,我就写个简单的使用说明,让大家知道并利用好这个工具吧。在MSDN里有很多关于AppVerifier的资料,有兴趣可以直接去http://msdn.microsoft.com搜。后面我附上几个不错的链接。注意:
1. AppVerifier的原理是hook分配和释放资源的API,在程序调用这些API时记录信息,在程序退出时报告出未释放的资源。
2. 只能检测Native代码。
3. 程序正常退出才行,强行杀进程不能得到正确的报告。
4. 基于原理,只能做Run-time检测。尽量使用程序的所有功能已保证检测到更多代码。
测试代码
void LeakMemory()
{
BYTE* p = new BYTE[10];
NKDbgPrintfW(L"Allocated memory: 0x%X", p);
}
void LeakHandle()
{
HANDLE h = CreateEvent(NULL, FALSE, FALSE, L"leaked_event");
NKDbgPrintfW(L"Created event: 0x%X", h);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
LeakMemory();
LeakHandle();
return 0;
}
很简单,泄漏一点内存和一个Event句柄。编译该代码生成Leak.exe/Leak.pdb/Leak.map,AppVerifier使用MAP文件查找调用栈的函数符号。下面我会分别说在Windows CE和Windows Mobile下的使用。
Windows CE
我是基于Windows CE 6测试的。PB6已经集成到Vistual Studio里了。
1. PB自带了AppVerifier, 拷贝D:/Program Files/Microsoft Platform Builder/6.00/cepb/wcetk/ddtk/armv4i目录下的下面这些与AppVerifier相关的文件到Release或者设备的/Windows目录。
appverif.exe
htracker.dll
shimexp.exe
shim_heap.dll
shim_hleak.dll
shim_usergdi.dll
shim_verifier.dll