Android native Memory分析

本文将分析Android native memory的使用情况及经过一些手段来定位到native memory leak代码。html

在EngLoad上执行如下adb命令linux


$ adb shell setprop libc.debug.malloc 1  
$ adb shell stop  
$ adb shell start


而后等手机从新启动后,连接DDMS就能够看到每一个SO文件占用的内存大小了。通常占用很大的比较可能发生内存泄露。android

(此图片引用自网络)shell

还有一种复杂的分析方法是结合process showmap, process maps及 process coredump3个文件来定位内存泄露代码,此方法能够直接定位到内存泄露代码,但须要是ENG版的手机和工程symbols文件。网络

首先,从process showmap文件中找出占用Memory最大的.so文件。app

362148 289012 288412 0 648 0 288634 1590 [anon:libc_malloc]ide

能够看到上面native分配占用了288412 Bytes约288M内存。idea

而后,输入arm-linux-androideabi-gdb进入gdbspa

(gdb)file <product_name>/symbols/system/bin/app_process (须要调试的程序)debug

(gdb)set solib-search-path <product_name>/symbols/system/lib(设置搜索的Symbols文件)

(gdb)core-file coredump (即process coredump文件) (检查内存及寄存器)

(gdb)source core_parser_leak_info_v0.1.gdb(解析内存分配点)

能够看到

alloc_size = alloc_num * size_per_alloc

270MBytes = 49252 * 5760

alloc_bt:

bt:0x7a215c

bt:0xfffffffc

接着,从process maps中能够看到

0064f000-008d0000 r-xp 00000000 b3:05 1296 /system/lib/libskia.so

因为0x7a215c 在libskia.so的地址范围内0064f000-008d0000,能够判定是libskia.so发生了内存泄露。

计算地址偏移0x7a215c - 0064f000 = 0x0015315c

最后,使用arm-linux-androideabi-addr2line 来定位代码

arm-linux-androideabi-addr2line -C -f -e <product_name>/symbols/system/lib/libskia.so 0x15315c

SkImageDecorder::onDecodeSubset(SkBitmap* , SkIRect const&)

external/src/images/SkImageDecorder_libjpeg.cpp:2874

参考文献:http://source.android.com/devices/native-memory.html

相关文章
相关标签/搜索