我电脑如何恢复到前几天前几年买的了。前几天刚换了固态硬盘 跟内存条。但速度有提升了一点。玩英雄联盟一开启录像功能就

下次自动登录
现在的位置:
    最近在论坛里看到很多人问怎样检查内存泄漏,对于Windows CE/Windows Mobile开发,微软已经为我们提供了很好的工具Application Verifier。AppVerifier是一个辅助开发工具,不用修改代码,可以检测出程序内存,句柄, GDI对象泄漏,并报告分配泄漏对象的调用栈,有过在大规模代码里查资源泄漏的兄弟应该知道这个调用栈的价值。
    在中文google里搜了下,没有发现讲这个工具使用的文章,我就写个简单的使用说明,让大家知道并利用好这个工具吧。在MSDN里有很多关于AppVerifier的资料,有兴趣可以直接去搜。后面我附上几个不错的链接。注意:
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();
很简单,泄漏一点内存和一个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
        shimeng.dll
        vlog.dll
symhlp.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目录。
2. 拷贝待测试程序和MAP文件到Release或者Device的Windows目录,也就是Leak.exe/Leak.map。
3. 运行D:\Program Files\Microsoft Platform Builder\6.00\cepb\wcetk\ddtk\desktop\AppVerifCE.exe (PB的安装目录下)
4. 选择Add…,输入待检测的exe文件名Leak.exe,不用全路径,并选中右边Test settings里要测试的项目,一般全选
5. 选择Connect…
6. 选择Connect…
这里选要连接的Device,我这里选Default Device,属性如下,运行在Device Emulator里带KITL的image。
7. 连接成功以后运行Leak.exe,在PB的Target 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:x41e98310: shim_heap.dll!APIHook_HeapAlloc + 5d0h
1535220 PID:206001e TID:x41e9b378: shim_heap.dll!APIHook_LocalAlloc + a8h
1535303 PID:206001e TID:x41e9c2f4: shim_heap.dll!APIHook_malloc + 18h
1535392 PID:206001e TID:x41e9c54c: shim_heap.dll!APIHook_new + 14h
1535596 PID:400002 TID:207001e RELFSD: Opening file leak.map from desktop
1535746 PID:206001e TID:x: leak.exe!?LeakMemory@@YAXXZ + ch //这是内存泄漏的调用栈
1535892 PID:206001e TID:x0001116c: leak.exe!WinMain + 10h
1536088 PID:206001e TID:x: leak.exe!WinMainCRTStartupHelper + 28h
1536210 PID:206001e TID:x000111cc: leak.exe!WinMainCRTStartup + 20h
1536341 PID:400002 TID:207001e RELFSD: Opening file coredll.map from desktop
1546679 PID:206001e TID:x40071f5c: coredll.dll!MainThreadBaseFunc + 2a0h
1546768 PID:206001e TID:207001e Un-freed items:
1546854 PID:206001e TID:x2c022dd0 10 bytes, process: 0x0206001e, thread://泄漏的内存地址和大小,可以看出和程序里的一致
0x0207001e, PerfCount:
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 = 0x Name: 'leaked_event' PerfCount:
//泄漏的句柄,可以看出何程序里是一样的
1547338 PID:206001e TID:207001e Callstack:
1547430 PID:400002 TID:207001e RELFSD: Opening file shim_hleak.map from desktop
1548302 PID:206001e TID:x41e84814: shim_hleak.dll!My_TrackerInsertItem2 + e0h
1548409 PID:206001e TID:x41e84710: shim_hleak.dll!My_TrackerInsertItem + 24h
1548486 PID:206001e TID:x41e84c00: shim_hleak.dll!APIHook_CreateEventW + 68h
1548653 PID:206001e TID:x0001112c: leak.exe!?LeakHandle@@YAXXZ + 18h //泄漏句柄的调用栈
1548819 PID:206001e TID:x: leak.exe!WinMain + 14h
1548979 PID:206001e TID:x: leak.exe!WinMainCRTStartupHelper + 28h
1549136 PID:206001e TID:x000111cc: leak.exe!WinMainCRTStartup + 20h
1549219 PID:206001e TID:x40071f5c: 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…看,如本测试的日志文件
Windows Mobile
1. 去下面地址下载安装。虽然写的是for Windows Mobile 5,但也适用于Windows Mobile 6。
注意Instructions节里的:
For systems that have never installed Platform Builder, complete the following additional steps:
1. Install the
(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 File为Yes。
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…看。
7.   发现有时候打开log,里面的符号不能被正确解析。解决方法:
      1) 打开log文件, 把类似下面callstack里不正确解析的符号
            | shim_heap.dll 30 | 0 nk.exe 8803754c'   0x1c04eac4: !(null) + 4eac4h
            | shim_heap.dll 30 | 0 nk.exe 8803754c'   0x1c04b2f0: !(null) + 4b2f0h
            | shim_heap.dll 30 | 0 nk.exe 8803754c'   0x1c04bad4: !(null) + 4bad4h
            | shim_heap.dll 30 | 0 nk.exe 8803754c'   0x1c0530f0: !(null) + 530f0h
         都改为:
            | shim_heap.dll 30 | 0 nk.exe 8803754c'   0x1c04eac4: leak.exe!(null) + 4eac4h
         然后像第6步里一样打开log,会提示map文件的位置,选择即可。
       2) 手动在map文件里找地址。比如上面的!(null) + 4eac4h, 在map文件的第3列,也就是Rva+Base,里找第一个比4eac4h小的地址就是了。
Windows Desktop(2000/XP/Vista…)
  AppVerifier也有Windows desktop上的版本,可惜不支持Memory Leak等检测,但说明说可以检测double free。不知道有什么好的检测资源泄漏的方案?听过BoundsChecker,Rational Purify。了解的朋友请告诉我下。
  之外,可以修改代码使用C Run-time库提供的些函数辅助检查。Debug版本下,在程序退出前加_CrtDumpMemoryLeaks,可以打出泄漏内存的内容,不过没有调用栈,比如:
Detected memory leaks!
Dumping objects -&
{110} normal block at 0x bytes long. //110是内存分配的ID
Data: &    & 01 00 00 00 //这是泄漏的内容, 可以根据大小和内容大概猜是什么东西
Object dump complete.
每个内存分配有个ID,比如上面110, 然后在程序入口处_CrtSetBreakAlloc(110),再重新开始debug,下次分配这个对象时就会断下来,你就可以看到调用栈了。如果每次分配内存的顺序是一样的,ID在多次运行程序会一样,这种方法不错,但在多线程环境下有局限。这种方法类似于ATL的QIThunk,见ATL Internals: Working with ATL 8, Second Edition第4章的Debugging节。
2. 视频教材
【上篇】【下篇】
您可能还会对这些文章感兴趣!
百度站内搜索
同分类最新文章1914人阅读
这个工具的作用是用于判断一个wince的AP及其组件对内存堆的分配释放,对句柄的创建销毁进行检查,对AP退出后没有释放的内存堆和句柄log出来,帮助开发者分析问题解决问题。当然对驱动它也可以搞定,我本人还木搞懂,所以先捂着还没热的一点经验,给大家一些引导,一是让大家知道有这么个东西(昨天我还不知道有这么个东西呢,嘿嘿),而是让大家知道怎么能最快用起这个东西,三是让大家知道怎么它的log。
1.先把设备端的目录拷贝到设备上执行,看到下面的对话框,呵呵,你的屏幕一定要够大才行哦。勾上要执行的hook,然后点击add来添加需要检查的exe,如图。2.从对话框里面选择要添加的exe3.新exe会出现在list列表,选择后点击run,如图。点击run后你的exe就运行起来了,模拟运行一段时间后关闭你的exe,记住一定要正常关闭,不能kill掉。这个时候会在根目录生成一个Appverifier_XXX.log的文件,这就是输出的结果。这个log文件你可以直接看,也可以用一个更加一目了然的工具来看。就是1楼我提供的PC端的viewer,你只需要把这个log拷贝到pc上即可。你的exe及其它调用的dll最好有编译的时候生成的map文件,如果有map档,viewer会帮会给你提供一个很重要的功能:从地址解析symbols,所以会告诉你具体哪个函数在做坏事。
现在教你怎么看log。我们先打比方我们的exe里面做了下面的坏事:
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;
那么会得到类似下面的log1532862 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& & 0x: leak.exe!?LeakMemory@@YAXXZ + ch //这是内存泄漏的调用栈1535892 PID:206001e TID:207001e& & 0x0001116c: leak.exe!WinMain + 10h1536088 PID:206001e TID:207001e& & 0x: 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: 1546941 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 = 0x Name: 'leaked_event' PerfCount:  //泄漏的句柄,可以看出何程序里是一样的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 + 68h1548653 PID:206001e TID:207001e& & 0x0001112c: leak.exe!?LeakHandle@@YAXXZ + 18h //泄漏句柄的调用栈1548819 PID:206001e TID:207001e& & 0x: leak.exe!WinMain + 14h1548979 PID:206001e TID:207001e& & 0x: 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 --------------------------------------------------------------------------------粗体字部分就是log里面告诉我们有内存或句柄问题的位置。定位粗体部分的位置很简单,就是看每个callstack的shim_xxx.dll开头尾随的第一句话。如果用viewer看,会清晰一些,下图是随便抓的一个sample:&heap的创建位置就是红线所画,但是它一直没有被释放直到程序退出。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:63186次
排名:千里之外
原创:16篇
评论:74条
(4)(1)(1)(1)(2)(8)Wince内存泄露检测工具Application Verifier的使用和如何快速定位泄露语句(二) - 推酷
Wince内存泄露检测工具Application Verifier的使用和如何快速定位泄露语句(二)
通过Application Verifier在wince端生成日志文件后,我们将文件拷贝到PC上通过PC端的工具进行日志分析,我们就可以定位出泄漏地址的代码行位置了,这里有个前提条件,那就是需要我们在编译程序时将程序的调试信息打开,VS2008设置选项配置方法如下:
1.配置属性 =& C/C++ =& 常规 =& 调试信息格式 =&&程序数据库(/Zi)
2.配置属性 =& 链接器 =& 调试 =& 生成调试信息 =&&是(/DEBUG)
这样就设置完成了,那么我们就可以用windows ce remote process explorer这个工具来通过地址定位代码了(其实也可以用map之类的手动计算函数偏移量来确定,这个方式很麻烦),工具下载地址:
下面开始上图:
使用ProcessExlporer&For&Wince工具上的
功能定位代码行
崩溃地址和泄漏地址同样方法查找代码行
是不是显示出了泄漏代码位置了,有时候定位的位置可能会相差1,2行左右,因为Release会优化些代码,所以定位不会100%准确。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致

我要回帖

更多关于 翻译 我前几天请假了 的文章

 

随机推荐