使用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、统计内存分配和释放
内存分配时,向列表中添加内存申请信息;内存释放时,将列表中对应的申请信息删除。
- 点赞
- 收藏
- 关注作者
评论(0)