Android Valgrind 使用

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也不确定,需要结合自己的判断。有时候,进程在起来的时候申请一块内存,中间一直不释放,等待进程结束时让操作系统自行回收,这也不算是泄露。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值