使用DDMS中的native heap检查Android native内存泄露

  1. 检查手机上目录system/lib(system/lib64)下存在libc_malloc_debug_leak.so、libc_malloc_debug_qemu.so(eng或者user-debug版本自带)
  2. setprop libc.debug.malloc 1(android7.0以后设置新属性 :setprop libc.debug.malloc.options backtrace https://android.googlesource.com/platform/bionic/+/master/libc/malloc_debug/README.md)。这里有四种prop可以设置,1是mem leak,5和10是内存越界,20是虚拟机。可悲的是5和10并没有被libc_malloc_debug库完美地支持,所以只有1好用
  3. adb shell stop, start (不要手动关机重启,否则上一步设置的属性值会丢失),getprop libc.debug.malloc查看结果
  4. 在ddms.cfg文件最后增加一行native=true并save。ddms.cfg位于.android目录下。(建议在官网上单独下载SDK工具包,使用里面的ddms)
  5. 打开ddms选择Native Heap页面,点击snapshot按钮。snapshot的过程有点慢。最后能看到每个so占用了多少内存以及百分比。过一段时间snapshot一次就能看到每个so的趋势了。
  6. 分析。snapshot显示了分配内存的地址(记做addressA),这个地址是RAM地址,不是so的相对地址。为了得到相对地址,需要ps一下,找到你的pid,然后cat /proc/pid/maps,找到so的起始地址(记做addressB)。然后拿addressA - addressB,得到相对地址,用addr2line定位到哪一处调用。或者使用objdump -dS libXXX.so > XXX.dump,把so反编译出来,分析XXX.dump,找到相对地址的调用位置(lib64下so:prebuilts/gcc/linux-x86/x86/x86_64-linux-android-4.9/bin/x86_64-linux-android-addr2line

你可能感兴趣的:(android开发)