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()を潰してリークするバイナリを作るとかしないとなので、時間があったら、また。とことで。(え゛ーーー