Android Zaurusの日記

ザウルスをアンドロイドにしてあげる
本館 Android Zaurus

2009-08-06

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

17:40 | 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]ボタンを押すらしい。


f:id:androidzaurus:20090806173542j:image


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

androidzaurusandroidzaurus 2009/08/08 11:27 [Load Symbols]するには、DDMSをビルドし直す。すると、自動的にout/targetからシンボルを拾うようになる。

androidzaurusandroidzaurus 2009/09/03 07:05 arm-eabi-addr2lineへのPATHを設定して、ANDROID_PRODUCT_OUTに/symbolsへのパスを設定するといい。らしい。