针对native的内存泄漏,我们经常谈到的有2中方法valgrind和malloc_debug,由于Arm不支持asan的memory leak特性,所以android使用asan是无法检测处内存泄漏的。
我们这里介绍一种利用malloc_debug来调试native进场内存泄漏的方法。首先介绍一下malloc_debug的使用方法:
adb shell setprop libc.debug.malloc.options "backtrace leak_track verbose"
adb shell setprop libc.debug.malloc.program xxxx(可以是你自己的进程)
adb shell export LIBC_DEBUG_MALLOC_OPTIONS=backtrace
adb shell export LIBC_DEBUG_MALLOC_ENABLE=1
启动bin
1.如何判断malloc_debug已经使能
adb shell ps -ef |grep xxx 查找启动进程的pid
然后查找该进程的smap
showmap $(pidof eatmemory) |grep malloc
如果出现下面的malloc_debug库的加载,那可以确认malloc_debug已经成功
2.如何找到内存泄漏点
malloc_debug有一个缺点,它只有在进程退出时,才回检测没有释放的内存,然后把每内存的申请调用栈打印,所以如果是类似常驻服务的进程,malloc_debug基本没用(第三步我们会介绍一种修改malloc_debug的方法,支持常驻服务的内存泄漏检测)。我们先看一下针对进程正常退出,我们怎么去查看。进程结束以后,会有类