Valgrind是什么
Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等。Valgrind可以检测内存泄漏和内存违例,还可以分析cache的使用等,灵活轻巧而又强大,能直穿程序错误的心脏,真可谓是程序员的瑞士军刀
Valgrind编译安装
Android 7.0 上已经集成了Valgrind,只需进入external/valgrind目录下,mm -j16就可以编译valgrind。编译成功后,在根目录下make -j16 就能编出image。
Valgrind运行
如果需要调试的程序是通过init进程起起来的,那么必须要在init.rc中禁止这个进程启动,再通过命令行的方式启动。比如,要调试mediaserver,那么就可以这样启动:
valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --log-file=/data/valgrind.log /system/bin/mediaserver
必须要以root的权限启动,否则会出错。valgrind的结果会保存在/data/valgrind.log中
Valgrind结果分析
如果出现Invalid write of size字样,就说明heap有溢出,这是很严重的错误
程序的跳转依赖于一个未初始化的变量
Valgrind的内存泄露结果一般可归为两种:
- 非常确定的
==2675== 185 (8 direct, 177 indirect) bytes in 2 blocks are definitely lost in loss record 2 of 17
==2675== at 0x48B9C94: calloc (in /system/lib/valgrind/vgpreload_memcheck-arm-linux.so
这种一般是由于valgrind检测到了内存指针悬空,已经不可能被释放了,所以是100%有泄露。
- 可能的
==2675== 2,491 bytes in 242 blocks are still reachable in loss record 3 of 17
==2675== at 0x48B7FBC: operator new[](unsigned int) (in /system/lib/valgrind/vgpreload_memcheck-arm-linux.so)
==2675==
==2675== 2,691 bytes in 137 blocks are possibly lost in loss record 4 of 17
==2675== at 0x48B7FBC: operator new[](unsigned int) (in /system/lib/valgrind/vgpreload_memcheck-arm-linux.so
这种是valgrind也不确定,需要结合自己的判断。有时候,进程在起来的时候申请一块内存,中间一直不释放,等待进程结束时让操作系统自行回收,这也不算是泄露。