native内存泄漏分析

本文介绍了如何分析和排查Android应用的Native内存泄漏问题。通过使用`dumpsys meminfo --unreachable`和`native_heapdump_viewer.py`工具,详细阐述了分析过程,包括设置监控进程、复现问题、抓取调用栈以及解析内存信息,从而定位并解决内存泄漏问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.摘要

    我们在分析内存泄漏时java内存泄漏我们可以集成LeakCanary来进行监控,出现问题时会打印出泄漏时的引用关系,那么我们native内存泄漏时如何分析呢?native内存泄漏我们可以通过malloc_debug工具来进行监控,详细的介绍请参考:

https://android.googlesource.com/platform/bionic/+/master/libc/malloc_debug/README.md

 

二.如何使用

    默认情况下高通的手机已经包含了malloc_debug的代码,具体路径在:bionic/libc/malloc_debug/,下边介绍使用方法:

1.使用dumpsys meminfo --unreachable分析

1.1设置你要监控的进程:

adb shell setprop wrap.<APP>  '"LIBC_DEBUG_MALLOC_OPTIONS=backtrace"'

例如:

adb shell setprop wrap.com.smartisanos.security '"LIBC_DEBUG_MALLOC_OPTIONS=backtrace"'

adb shell am force-stop com.smartisanos.security

1.2重启进程:

设置完属性后需要重启进程,我们先杀死进程adb shell am force-stop <APP>

如果之前的设置正常,进程重启后你会发现你进程的父进程并不是zygote64,而是:

sh -c LIBC_DEBUG_MALLOC_OPTIONS=backtrace /system/bin/app_process64 /system/bin --application '--nice-name=com.smartisanos.security' com.android.internal.os.WrapperInit 35 28 'android.app.ActivityThread' '0'

这就说明我们设置好了

1.3不断复现你的问题并且抓取分配内存的调用栈:adb shell dumpsys meminfo --unreachable pid | tee app_size.txt

1.4对比你APP 不同native size产生的日志问题,寻找问题

例如:

com.smartisanos.security APP Native Heap:    66696byte 时有如下栈信息:

 Unreachable memory

  65376 bytes in 1349 unreachable allocations

  ABI: 'arm64'



  48 bytes unreachable at 75aa29e0b0

   and 62832 similar unreachable bytes in 1309 allocations

   referencing 1248 unreachable bytes in 26 allocations

   first 32 bytes of contents:

   75aa29e0b0: 18 67 43 4d 76 00 00 00 00 00 00 00 00 00 00 00 .gCMv...........

   75aa29e0c0: 00 00 00 00 00 00 00 00 b0 90 fa ad 75 00 00 00 ............u...

          #00  pc 000000000006a4f8  /system/lib64/libc++.so (operator new(unsigned long)+32)

          #01  pc 000000000007062c  /system/lib64/libhwui.so

          #02  pc 0000000000068818  /system/lib64/libhwui.so

          #03  pc 000000000006c404  /system/lib64/libhwui.so

          #04  pc 0000000000075a84  /system/lib64/libhwui.so (android::uirenderer::renderthread::RenderThread::threadLoop()+340)

          #05  pc 00000000000114e8  /system/lib64/libutils.so (android::Thread::_threadLoop(void*)+280)

          #06  pc 00000000000ad7ec  /system/lib64/libandroid_runtime.so (android::AndroidRuntime::javaThreadShell(void*)+140)

          #07  pc 000000000006827c  /system/lib64/libc.so

          #
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值