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

相關文章
相關標籤/搜索