DDMSでAndroidのNative Heapをのぞきみる

9/22/2010 Update
libc.soの置き換えは不要*1

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

始まりはいつもandroid-porting*2。Nativeのメモリリーク調べるにはどーしたらいいの?という質問に、それDDMSで出来るよという回答*3が。ターゲットのlibc.soをlibc_debug.soに入れ替えて、ホストの~/.android/ddms.cfgに"native=true"を追加して、ddmsを起動するらしい。


とことで、早速やってみた。libc.soをlibc_debug.soに置き換えて、Androidを再起動するとlogcatにそれっぽいメッセージがでる。

I/libc    ( 1376): /system/bin/sh using MALLOC_DEBUG = 1 (leak checker)
I/libc    ( 1377): logcat using MALLOC_DEBUG = 1 (leak checker)

おもむろにDDMSを起動すると、新しくNative Heapというタグが出現する。見たいプロセスを選んで[Full Update]ボタンを押すらしい。



なんか取れた。アドレスがバイナリで何が何やら。[Load Symbols]ってボタンはグレーアウトしたまま。しょうがないのでobjdumpしてみた。

$ cd myrdroid/out/target/product/generic/symbols/system/lib
$ arm-none-linux-gnueabi-objdump -t libc_debug.so | sort | \
  grep ^0000a9
0000a938 l     F .text  0000022c leak_malloc

DDMSで表示しているの8000a98cは、leak_mallocでしょう、たぶん。違ってたら指摘ツッコミ毀誉褒貶よろ。これがどれくらい使えるかは、実際にリークするライブラリを作るか、既存のfree()を潰してリークするバイナリを作るとかしないとなので、時間があったら、また。とことで。(え゛ーーー