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找到内存泄漏的具体位置。
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- Java内存泄漏分析系列之二(jstack生成的Thread|Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析)
- iOS内存对齐原则
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 内存管理概念与原理以及解决办法
- c语言|一文搞懂栈(stack)、堆(heap)、单片机裸机内存管理malloc
- C语言学习(bit)|16.C语言进阶——深度剖析数据在内存中的存储
- 内存管理
- Java内存溢出及解决
- js类型转换和内存