Android malloc debug定位native内存问题(主要是内存泄漏)

本文介绍了如何使用Android的malloc debug工具检测非法内存使用和内存泄漏,以及结合heapsnap库进行实时堆快照分析,通过示例详细展示了设置过程和分析方法,帮助开发者定位并解决native层的内存问题。
摘要由CSDN通过智能技术生成

android sources全局指导坐镇

https://source.android.com/devices/tech/debug/native-memory

一直没有实践native进程的内存泄漏问题的debug,网上也一直没找到有用的。直到遇到heapsnap,发现真是有用,至此一块心病也是解决了。再加上之前用asan来分析userspace的内存问题,可以说稳定性这块关于内存的算是有初步的把握了。后续就是需要对内核关于内存的优化有更多的学习和总结。

验证Android版本为P

1.用malloc debug发现内存非法使用问题
setprop libc.debug.malloc.options backtrace
setprop libc.debug.malloc.program vendor/bin/test

11-15 10:29:51.406  4573  4573 I malloc_debug: ./vendor/bin/test: Run: 'kill -47 4573' to dump the backtrace.
11-15 10:29:51.408  4573  4573 I libc    : ./vendor/bin/test: malloc debug enabled
11-15 10:29:51.410  4573  4573 D         : test main
11-15 10:29:51.410  4573  4573 D TEST    : test begin1
11-15 10:29:51.410  4573  4573 D TEST    : double free
11-15 10:29:51.410  4573  4573 E TEST    : afte free test1: -1345756352
11-15 10:29:51.410  4573  4573 E TEST    : afte free test2 99
11-15 10:29:51.410  4573  4573 E malloc_debug: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
11-15 10:29:51.410  4573  4573 E malloc_debug: +++ ALLOCATION 0xafc8c018 UNKNOWN POINTER (free)
11-15 10:29:51.410  4573  4573 E malloc_debug: Backtrace at time of failure:
11-15 10:29:51.410  4573  4573 E malloc_debug:           #00  pc 00000d08  /vendor/lib/libtest.so (doTest()+71)
11-15 10:29:51.410  4573  4573 E malloc_debug:           #01  pc 00088f54  /system/lib/libc.so (__libc_init+47)
11-15 10:29:51.410  4573  4573 E malloc_debug:           #02  pc 00000ba2  /vendor/bin/test
11-15 10:29:51.411  4573  4573 E malloc_debug: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
11-15 10:29:51.411  4573  4573 E TEST    : afte free 2 times

an.xi@droid01:/mnt/fileroot/an.xi/p$ addr2line -ife out/target/product/ampere/symbols/vendor/lib/libtest.so 00000d08
_Z6doTestv
vendor/amlogic/common/system/libtest/testlib.cpp:34


 30     free (buf_);
 31     ALOGE("afte free test1: %d\n",buf_->test1);
 32     buf_->tes

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
内存泄漏是指在程序执行过程中,动态分配的内存没有被正确释放,导致内存空间被占用并无法再被重复利用的问题内存泄漏问题的排查是找出造成内存泄漏的代码和地方。 在C++中,我们可以通过重载malloc函数来帮助排查内存泄漏问题malloc函数用于分配内存空间,我们可以自定义一个重载函数,在该函数中添加一些记录和追踪内存分配的操作。 我们可以重载malloc函数来统计分配的内存大小和数量,并将分配的内存记录到一个容器中。可以使用一个全局的哈希表或者链表,每次调用重载的malloc函数时,记录下分配的内存大小和指针地址。当程序结束时,可以输出这个容器中的信息,包括每个分配的内存的大小和对应的指针地址。 通过重载malloc函数,我们可以很容易地定位到哪些地方分配内存后没有及时释放。我们可以在程序中的一些重要位置,比如函数或循环的入口和出口,输出当前的内存分配信息。通过对比入口和出口处的内存分配信息,可以找出内存泄漏的位置。 当然,重载malloc函数仅仅是一种辅助手段,它依赖于程序员的使用和分析。在使用malloc函数时,程序员需要有意识地进行内存的释放操作。只有当程序员规范使用malloc函数,并且及时释放内存时,才能避免内存泄漏问题的发生。 总之,通过重载malloc函数,我们可以在程序运行过程中动态地追踪内存分配的情况,并辅助排查内存泄漏问题。但是,重载malloc函数并不能完全解决内存泄漏问题,程序员仍然需要注意内存的释放操作,以避免内存泄漏的发生。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值