使用Application Verifier AppVerifier 检查资源泄漏

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

原文地址http://blog.csdn.net/xdkui/archive/2008/12/19/3560143.aspx

(感谢作者,这篇文章太有用了)

最近在论坛里看到很多人问怎样检查内存泄漏,对于Windows CE/Windows Mobile开发,微软已经为我们提供了很好的工具Application VerifierAppVerifier是一个辅助开发工具,不用修改代码,可以检测出程序内存,句柄, 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.mapAppVerifier使用MAP文件查找调用栈的函数符号。下面我会分别说在Windows CEWindows 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

        shimeng.dll

        vlog.dll

        symhlp.dll

D:/Program Files/Microsoft Platform Builder/6.00/cepb/wcetk/ddtk目录下有desktop/x86/armv4i等子目录。Desktop目录下的文件是运行在desktopWindows(2000/XP/Vista)的,需要通过ActiveSync或者KITL等连接到Device上。别的目录是运行在相应平台的Device上的。后面Windows MobileAppVerifier的目录结构一样。

上面的appverif.exeAppVerifierDevice上运行的程序,带UI,也支持命令行参数,在PBTarget 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目录。

 

2.       拷贝待测试程序和MAP文件到Release或者DeviceWindows目录,也就是Leak.exe/Leak.map

3.       运行D:/Program Files/Microsoft Platform Builder/6.00/cepb/wcetk/ddtk/desktop/AppVerifCE.exe (PB的安装目录下)

使用Application Verifier AppVerifier 检查资源泄漏_第1张图片

4.       选择Add…,输入待检测的exe文件名Leak.exe,不用全路径,并选中右边Test settings里要测试的项目,一般全选

 

使用Application Verifier AppVerifier 检查资源泄漏_第2张图片

5.       选择Connect…

 

使用Application Verifier AppVerifier 检查资源泄漏_第3张图片

6.       选择Connect…

 

使用Application Verifier AppVerifier 检查资源泄漏_第4张图片

这里选要连接的Device,我这里选Default Device,属性如下,运行在Device Emulator里带KITLimage

使用Application Verifier AppVerifier 检查资源泄漏_第5张图片

 

7.       连接成功以后运行Leak.exe,在PBTarget Control里输入s Leak.exe。可以看到Output窗口里有如下输出:

1532862 PID:206001e TID:207001e Allocated memory: 0x2C022DD0 //这两行是程序输出的

1532878 PID:206001e TID:207001e Created event: 0x521603

1532985 PID:206001e TID:207001e Application verifier core unloaded from: leak.exe - 11:39:44 PM

1533001 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: 0

1533122 PID:206001e TID:207001e    Current bytes: 10, Max: 10

1533136 PID:206001e TID:207001e    Current count: 1, Max: 1

1533150 PID:206001e TID:207001e    Free list bytes: 0

1533164 PID:206001e TID:207001e    Free list size: 0

1533183 PID:206001e TID:207001e Checking for un-freed items in heap 0x2c020010...

1533244 PID:206001e TID:207001e ----------------------------------------

1533260 PID:206001e TID:207001e TrackedItem count: 1

1533273 PID:206001e TID:207001e Callstack:

1533368 PID:206001e TID:207001e Console NOT redirected for process 0x206001E

1533506 PID:400002 TID:207001e RELFSD: Opening file shim_heap.map from desktop

1535138 PID:206001e TID:207001e    0x41e98310: shim_heap.dll!APIHook_HeapAlloc + 5d0h

1535220 PID:206001e TID:207001e    0x41e9b378: shim_heap.dll!APIHook_LocalAlloc + a8h

1535303 PID:206001e TID:207001e    0x41e9c2f4: shim_heap.dll!APIHook_malloc + 18h

1535392 PID:206001e TID:207001e    0x41e9c54c: shim_heap.dll!APIHook_new + 14h

1535596 PID:400002 TID:207001e RELFSD: Opening file leak.map from desktop

1535746 PID:206001e TID:207001e    0x000110e0: leak.exe!?LeakMemory@@YAXXZ + ch //这是内存泄漏的调用栈

1535892 PID:206001e TID:207001e    0x0001116c: leak.exe!WinMain + 10h

1536088 PID:206001e TID:207001e    0x00011208: leak.exe!WinMainCRTStartupHelper + 28h

1536210 PID:206001e TID:207001e    0x000111cc: leak.exe!WinMainCRTStartup + 20h

1536341 PID:400002 TID:207001e RELFSD: Opening file coredll.map from desktop

1546679 PID:206001e TID:207001e    0x40071f5c: coredll.dll!MainThreadBaseFunc + 2a0h

1546768 PID:206001e TID:207001e Un-freed items:

1546854 PID:206001e TID:207001e    0x2c022dd0      10 bytes, process: 0x0206001e, thread://泄漏的内存地址和大小,可以看出和程序里的一致

 0x0207001e, PerfCount: 1021127120

1546941 PID:206001e TID:207001e       Total: 10 bytes

1547026 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.exe

1547046 PID:206001e TID:207001e Num of un-freed handles = 1

1547046 PID:206001e TID:207001e Check log file for details

1547046 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 desktop

1548302 PID:206001e TID:207001e    0x41e84814: shim_hleak.dll!My_TrackerInsertItem2 + e0h

1548409 PID:206001e TID:207001e    0x41e84710: shim_hleak.dll!My_TrackerInsertItem + 24h

1548486 PID:206001e TID:207001e    0x41e84c00: shim_hleak.dll!APIHook_CreateEventW + 68h

1548653 PID:206001e TID:207001e    0x0001112c: leak.exe!?LeakHandle@@YAXXZ + 18h //泄漏句柄的调用栈

1548819 PID:206001e TID:207001e    0x00011170: leak.exe!WinMain + 14h

1548979 PID:206001e TID:207001e    0x00011208: leak.exe!WinMainCRTStartupHelper + 28h

1549136 PID:206001e TID:207001e    0x000111cc: leak.exe!WinMainCRTStartup + 20h

1549219 PID:206001e TID:207001e    0x40071f5c: coredll.dll!MainThreadBaseFunc + 2a0h

1549240 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…看,如本测试的日志文件

 

使用Application Verifier AppVerifier 检查资源泄漏_第6张图片

Windows Mobile

1.       去下面地址下载安装。虽然写的是for Windows Mobile 5,但也适用于Windows Mobile 6

http://www.microsoft.com/downloads/details.aspx?FamilyID=d275348a-d937-4d88-ae25-28702c78748d&DisplayLang=en

注意Instructions节里的:

For systems that have never installed Platform Builder, complete the following additional steps:

1. Install the Windows CE 5.0 Stand Alone CETK (this provides connection libraries needed).

2. Replace the Application verifier binaries in the processor folder for the device type. For example, replace C:/Program Files/Windows CE platform builder/5.00/CEPB/wcetk/DDTK/ARMV4I with C:/Program Files/Application Verifier for Mobile 5.0/Armv4i.

当你需要在Desktop上运行AppVerifier然后连接Device(像我在演示Windows CE里做的)时需要做这两步。我下面将演示直接在Device上运行,所以不用这两步。

2.       启动Mobile设备,我这里用的Device Emulator

3.       拷贝D:/Program Files/Application Verifier for Mobile 5.0/Armv4i目录下的与AppVerifier相关的文件到Device Emulator里的Windows目录。

4.       拷贝待测试程序和MAP文件到Device,也就是Leak.exe/Leak.map,其中Leak.map得拷贝到/Windows目录,不然生成的日志里看不到函数符号。生成MAP文件需要修改工程属性如下,改Generate Map FileYes

 

使用Application Verifier AppVerifier 检查资源泄漏_第7张图片

5.       Device Emulator里运行/Windows/AppVerif.exe,选择Add…添加Leak.exe并选择Test settings

 

6.       Device上运行Leak.exe,会在Device的根目录生成日志文件,比如/ AppVerifier_Leak_1643.log。直接用记事本打开就可以看到日志,或者运行D:/Program Files/Application Verifier for Mobile 5.0/Desktop/ AppVerifCE.exe,然后选择View Exported Log…看。

 

Windows Desktop(2000/XP/Vista…)

  AppVerifier也有Windows desktop上的版本,可惜不支持Memory Leak等检测,但说明说可以检测double free。不知道有什么好的检测资源泄漏的方案?听过BoundsCheckerRational Purify。了解的朋友请告诉我下。

 

  之外,可以修改代码使用C Run-time库提供的些函数辅助检查。Debug版本下,在程序退出前加_CrtDumpMemoryLeaks,可以打出泄漏内存的内容,不过没有调用栈,比如

    Detected memory leaks! 

    Dumping objects -> 

    {110} normal block at 0x00917D88, 4 bytes long. //110是内存分配的ID

    Data: <    > 01 00 00 00 //这是泄漏的内容, 可以根据大小和内容大概猜是什么东西 

    Object dump complete.

每个内存分配有个ID,比如上面110 然后在程序入口处_CrtSetBreakAlloc(110),再重新开始debug,下次分配这个对象时就会断下来,你就可以看到调用栈了。如果每次分配内存的顺序是一样的,ID在多次运行程序会一样,这种方法不错,但在多线程环境下有局限。这种方法类似于ATLQIThunkATL Internals: Working with ATL 8, Second Edition4章的Debugging节。

附录

1.       Application Verifier for Windows CE and Windows Mobile 5.0

http://msdn.microsoft.com/en-us/library/aa446904.aspx

 

2.       视频教材 Using AppVerifier to debug Windows Mobile Applications

http://download.microsoft.com/download/0/9/f/09fb0ed3-cc89-4f94-a022-c362902f50a2/UsingAppVerifierWindowsMobile.wmv

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述
你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block var foo = 'bar'; 

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目 Value
电脑 $1600
手机 $12
导管 $1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

gantt
        dateFormat  YYYY-MM-DD
        title Adding GANTT diagram functionality to mermaid
        section 现有任务
        已完成               :done,    des1, 2014-01-06,2014-01-08
        进行中               :active,  des2, 2014-01-09, 3d
        计划一               :         des3, after des2, 5d
        计划二               :         des4, after des3, 5d
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

你可能感兴趣的:(使用Application Verifier AppVerifier 检查资源泄漏)