native heapのメモリリークを調べたいとき
DDMSでnativeのallocateされたサイズと回数を見ることができます。
freeが行われると、回数カウントはちゃんとデクリメントされるようなので、ある操作をし続けてカウントがどんどん増えていく奴がリークの可能性大ということですね。
まず、ターゲット端末の
/system/libにlibc_malloc_debug_leak.soがあるかどうかを確認。
あれば、そのまま次に進みます。
ない場合、TARGET_BUILD_VARIANT=engにしてAndroid OS全体の再ビルド&焼き直しが必要です。
make TARGET_BUILD_VARIANT=eng
ここでその環境のない人はThe endですかね。
次にターゲット端末で以下のようにします。
adb shell setprop libc.debug.malloc 1 adb shell stop adb shell start
~/.android/ddms.cfgに"native=true"を追加して、ddmsを起動します。このときEclipseと同時に起動するとプロセス欄が?だらけになるので、Eclipseを起動している場合は終了します。(Android SDK Ver. 13時点)
EclipseのDDMSではこれだけではできません。出来る方法があるという噂ですがやってません。
これでDDMSにNative Heapタブが出現するので、自分が調べたいプロセスを左側で選択し、調べたいタイミングでFull Updateボタンを押します。
すると、Listに変化があると思います。ない場合はsetprop等をやっているか再確認してください。
Display項目はAllocation Listだと観にくかったので、By Librariesにすると見やすくなります。
これで、Total size多い順にソートされ、そのうち一つを選択するとスタックトレースらしきログも見れます(ただクリックしてもListが隠れてしまっているので、マウスで引き出したりと変な動作が必要ですが…)ので、誰がどれだけのサイズを何回allocしたかわかります。
さらにシンボル名まで出す手段があるようですが(またビルドが必要?)、やってません。
参照URL
http://d.hatena.ne.jp/androidzaurus/20090806/1249548020