appverifier用法
来源:互联网 发布:大学生网络购物2016 编辑:程序博客网 时间:2024/06/16 03:52
[转载]:出处不详
AppVerifier是一个辅助开发工具,不用修改代码,可以检测出程序内存,句柄, GDI对象泄漏,并报告分配泄漏对象的调用栈,有过在大规模代码里查资源泄漏的兄弟应该知道这个调用栈的价值. 注意以下几点:
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 CE 6测试的。PB6已经集成到Vistual Studio 2005里了。
PB自带了AppVerifier, 拷贝D:/Program Files/Microsoft Platform Builder/6.00/cepb/wcetk/ddtk/armv4i目录下的下面这些与AppVerifier相关的文件到Release或者设备的/Windows目录。
appverif.exehtracker.dllshimexp.exeshim_heap.dllshim_usergdi.dll
shim_verifier.dllshimeng.dllvlog.dllsymhlp.dll
在D:/Program Files/Microsoft Platform Builder/6.00/cepb/wcetk/ddtk目录下有desktop/x86/armv4i等子目录。Desktop目录下的文件是运行在desktop版Windows里(2000/XP/Vista)的,需要通过ActiveSync或者KITL等连接到Device上。别的目录是运行在相应平台的Device上的。后面Windows Mobile里AppVerifier的目录结构一样。
上面的appverif.exe是AppVerifier在Device上运行的程序,带UI,也支持命令行参数,在PB的Target Control里输入s appverif –h即可看到帮助。
为了简单,我拷贝了这个目录下所有文件到Release目录:
在PB里打开Build Window,然后命令行执行:
D:/WINCE600>copy "D:/Program Files/Microsoft Platform Builder/6.00/cepb/wcetk/ddtk/armv4i/*" %_FLATRELEASEDIR%
也可以使用Remote File Viewer把这些AppVerifier相关的文件拷贝的/Windows目录。
拷贝待测试程序和MAP文件到Release或者Device的Windows目录,也就是Leak.exe/Leak.map。
运行D:/Program Files/Microsoft Platform Builder/6.00/cepb/wcetk/ddtk/desktop/AppVerifCE.exe (PB的安装目录下)
选择Add…,输入待检测的exe文件名Leak.exe,不用全路径,并选中右边Test settings里要测试的项目,一般全选
选择Connect…(需要activesync和网络联接)
选择Connect…
这里选要连接的Device,我这里选Default Device,属性如下,运行在Device Emulator里带KITL的image。
连接成功以后运行Leak.exe,在PB的Target Control里输入s Leak.exe。可以看到Output窗口里有如下输出:
1532862 PID:206001e TID:207001e Allocated memory: 0x2C022DD0 //这两行是程序输出的1532878 PID:206001e TID:207001e Created event: 0x5216031532985 PID:206001e TID:207001e Application verifier core unloaded from: leak.exe - 11:39:44 PM1533001 PID:206001e TID:207001e DLL_PROCESS_DETACH: Shim_heap checking for abandoned heaps/allocations...1533094 PID:206001e TID:207001e Heap statistics for heap 0x2c020010:1533108 PID:206001e TID:207001e Initial size: 0, Maximum size: 01533122 PID:206001e TID:207001e Current bytes: 10, Max: 101533136 PID:206001e TID:207001e Current count: 1, Max: 11533150 PID:206001e TID:207001e Free list bytes: 01533164 PID:206001e TID:207001e Free list size: 01533183 PID:206001e TID:207001e Checking for un-freed items in heap 0x2c020010...1533244 PID:206001e TID:207001e ----------------------------------------1533260 PID:206001e TID:207001e TrackedItem count: 11533273 PID:206001e TID:207001e Callstack:1533368 PID:206001e TID:207001e Console NOT redirected for process 0x206001E1533506 PID:400002 TID:207001e RELFSD: Opening file shim_heap.map from desktop1535138 PID:206001e TID:207001e 0x41e98310: shim_heap.dll!APIHook_HeapAlloc + 5d0h1535220 PID:206001e TID:207001e 0x41e9b378: shim_heap.dll!APIHook_LocalAlloc + a8h1535303 PID:206001e TID:207001e 0x41e9c2f4: shim_heap.dll!APIHook_malloc + 18h1535392 PID:206001e TID:207001e 0x41e9c54c: shim_heap.dll!APIHook_new + 14h1535596 PID:400002 TID:207001e RELFSD: Opening file leak.map from desktop1535746 PID:206001e TID:207001e 0x000110e0: leak.exe!?LeakMemory@@YAXXZ + ch //这是内存泄漏的调用栈1535892 PID:206001e TID:207001e 0x0001116c: leak.exe!WinMain + 10h1536088 PID:206001e TID:207001e 0x00011208: leak.exe!WinMainCRTStartupHelper + 28h1536210 PID:206001e TID:207001e 0x000111cc: leak.exe!WinMainCRTStartup + 20h1536341 PID:400002 TID:207001e RELFSD: Opening file coredll.map from desktop1546679 PID:206001e TID:207001e 0x40071f5c: coredll.dll!MainThreadBaseFunc + 2a0h1546768 PID:206001e TID:207001e Un-freed items:1546854 PID:206001e TID:207001e 0x2c022dd0 10 bytes, process: 0x0206001e, thread://泄漏的内存地址和大小,可以看出和程序里的一致 0x0207001e, PerfCount: 10211271201546941 PID:206001e TID:207001e Total: 10 bytes1547026 PID:206001e TID:207001e Checking for leaks in marshall helper api''s...1547043 PID:206001e TID:207001e ------------------------------------------------------------------------1547045 PID:206001e TID:207001e Shim HLeak detaching from process /Release/leak.exe1547046 PID:206001e TID:207001e Num of un-freed handles = 11547046 PID:206001e TID:207001e Check log file for details1547046 PID:206001e TID:207001e ------------------------------------------------------------------------1547047 PID:206001e TID:207001e ----------------------1547256 PID:206001e TID:207001e EVENT Handle = 0x00521603 Name: ''leaked_event'' PerfCount: 1021895588 //泄漏的句柄,可以看出何程序里是一样的1547338 PID:206001e TID:207001e Callstack:1547430 PID:400002 TID:207001e RELFSD: Opening file shim_hleak.map from desktop1548302 PID:206001e TID:207001e 0x41e84814: shim_hleak.dll!My_TrackerInsertItem2 + e0h1548409 PID:206001e TID:207001e 0x41e84710: shim_hleak.dll!My_TrackerInsertItem + 24h1548486 PID:206001e TID:207001e 0x41e84c00: shim_hleak.dll!APIHook_CreateEventW + 68h1548819 PID:206001e TID:207001e 0x00011170: leak.exe!WinMain + 14h1548979 PID:206001e TID:207001e 0x00011208: leak.exe!WinMainCRTStartupHelper + 28h1549136 PID:206001e TID:207001e 0x000111cc: leak.exe!WinMainCRTStartup + 20h1549219 PID:206001e TID:207001e 0x40071f5c: coredll.dll!MainThreadBaseFunc + 2a0h1549240 PID:206001e TID:207001e DLL_PROCESS_DETACH: Shim_usergdi checking for abandoned resources...1549340 PID:206001e TID:207001e --------------------------------------------------------------------------------1549355 PID:206001e TID:207001e VLOG exiting - check for verifier logs (22 info, 5 warnings, 0 errors)1549368 PID:206001e TID:207001e Process log: /release/AppVerifier_leak_2339.log //这是日志文件,文本格式,可以直接打开看1549381 PID:206001e TID:207001e --------------------------------------------------------------------------------
对于日志文件,也可以在图1的界面里选择Get Logs…保存日志到本地,然后选择View Exported Log…看,如本测试的日志文件
- appverifier用法
- appverifier
- 使用appverifier
- 软件推广:AppVerifier
- 如何使用Appverifier ?
- 如何使用Appverifier ?
- 如何使用appverifier?
- 【收集】AppVerifier(应用程序验证器)
- 使用Appverifier 查找堆损坏
- AppVerifier的功能和原理
- 用AppVerifier查找堆破坏
- 使用Application Verifier (AppVerifier)检查资源泄漏
- 使用Application Verifier (AppVerifier)检查资源泄漏
- 使用Application Verifier (AppVerifier)检查资源泄漏
- AppVerifier的使用1-生成log文件
- 使用Application Verifier (AppVerifier)检查资源泄漏
- 使用Application Verifier (AppVerifier)检查资源泄漏
- 使用Application Verifier (AppVerifier)检查资源泄漏
- 大冷股份未来重要业绩增长点:水源热泵
- c traps and pitfalls整理笔记
- jqDnR bug 解决
- PB编译错误整理
- 小小便利签
- appverifier用法
- 深入浅出Wince的存储机制
- ocx与dll的区别
- 直接调用RWsSession绘屏
- Eclipse3.5(Galileo)插件安装问题解决
- 数据库只有mdf文件而没有ldf文件,如何恢复数据库
- Wince下扩展串口
- 5分钟破解诺基亚Symbian9.2 S60V3三版手机方法总结
- wince tips