wince6.0 内存泄漏检测实践

环境vs2005 wince6.0 Telechips 890x
系统长时间运行后,会有内存不足现象,应该有内存泄漏。
经过艰苦的排查,最终发现USB驱动,在每次插拔或USB电源开关,都会导致内存泄露。


【wince6.0 内存泄漏检测实践】检测用到过以下工具:
1.Remote Tools : 主要用到Heap walker,Kernel tracker,Performance Monitor
Heap walker:可以用来查看比较每个进程堆的使用状态。这在确定是内核还是应用,具体哪个堆内存使用异常有用。
Kernel tracker:可以用来追踪异常的堆在哪个线程分配,释放。

Performance Monitor:可以直观显示内存(heap memory,availabe physical)使用变化,对于确定是否有内存泄漏很有用。

2. appverifce.exe
codeSnitch
这两个应用功能差不多,在查找应用的内存泄漏很有用,但内核的内存泄漏检测不了,因为都需要正常退出应用,才可以给出内存分配及释放报告。
3.kitl
需编译带KITL的内核,进行内核DEBUG,用来查找内存泄漏的具体位置。
4.target control
内核如果不包含,target control 窗口输入命令,没有反应。此时,可以用下面的方法:
建立或打开一个智能设备项目,在属性-》调试-》远程可执行文件中输入: shell.exe
命令参数输入:-c mi kernel
可以打印内核内存信息。mi full 可以打印包括应用的内存信息。对确定是否有内存泄漏很有用。


USB驱动内存泄漏检测过程小结:
1.先用target control 或 Performance Monitor 监控内存使用,可以发现,每次插拔,NK.EXE进程内存使用都会增加9 pages(36K)
2.再用target control(mi full)或Heap walker,定位插入USB分配而拔出USB未释放的堆.用Kernel tracker查找分配堆的线程。
从而定位到线程:HubStatusChangeTread
3.如果有驱动源码,就可以通过源码分析,或KITL DEBUG找到内存泄漏的具体位置。








    推荐阅读