本文將分析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