使用LeakTracer分析Android native内存泄漏

举报
VR小粉丝 发表于 2020/08/17 15:45:18 2020/08/17
【摘要】 使用LeakTracer分析Android native内存泄漏

LeakTracer是一个简单的内存申请释放分析工具,通过重写内存分配函数(new、delete、malloc等),记录内存的分配和释放情况,记录申请内存调用堆栈。


LeakTracer的github地址:https://github.com/fredericgermain/LeakTracer

LeakTracer Android demo:https://github.com/wangshengyang1996/AndroidLeakTracer


LeakTracer主要涉及以下内容:

1、重写内存分配函数

在LeakTracer中,重写了内存分配和释放函数new、delete、malloc、free等。原本用户代码编译链接时,会自动链接到标准c、c++库的new、delete、malloc、free。如果在编译链接时,先链接LeakTracer,则会去调用LeakTracer库中重写的内存函数。如此,用户代码的所有内存分配、释放都会调用LeakTracer中重写的new、delete、malloc、free等函数,而LeakTracer中重写的内存函数,会记录内存的申请和释放情况,并保持到列表中,待程序退出时,将所有为释放的内存申请保存至文件中。


2、获取调用堆栈

需要追踪到内存泄漏的代码,最方便的方式是我们能够获取内存泄漏点的内存申请堆栈。这就要求必须在申请内存时,把申请内存的调用堆栈保存到列表中。在android中获取内存调用堆栈,可以使用编译器内建函数__builtin_frame_address、__builtin_return_address获取函数的调用栈,或者使用_Unwind_Backtrace获取函数的调用栈。

在实际的测试过程中,_Unwind_Backtrace函数耗时较大,对于性能要求较高的程序,可能影响程序运行。

LeakTracer中使用内建函数__builtin_frame_address、__builtin_return_address获取的堆栈,获取到的堆栈为绝对地址。而对于so库,堆栈的绝对值是无用的,并不能通过这个值来计算对应代码行。LeakTracer Android demo中作者针对android so库做了相对堆栈地址计算,在导入so时,计算当前so的起始地址,并在每次计算调用栈地址时,减去该so起始地址,得到相对地址。


3、统计内存分配和释放

内存分配时,向列表中添加内存申请信息;内存释放时,将列表中对应的申请信息删除。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。