AddressSanitizer(HWASan / ASan)
Android プラットフォームのデベロッパーは、C/C++ のメモリバグを検出するために HWAddressSanitizer(HWASan)を使用します。
ci.android.com からサポート対象の Google Pixel デバイスにビルド済みの HWASan イメージを書き込めます(詳細な設定手順)。
Android 8.0(Oreo)以降では、ASan を使用して、ルート権限がない製品版デバイス上でもアプリをデバッグできるようになりました。使用方法については、ASan Wiki をご覧ください。Heapprofd
Android 10 は、オーバーヘッドの少ないサンプリング ヒープ プロファイラである heapprofd をサポートしています。heapprofd では、プログラム内のコールスタックにネイティブ メモリの使用を関連付けることができます。詳細については、Perfetto ドキュメント サイトの heapprofd - Android Heap Profiler をご覧ください。
malloc デバッグ
ネイティブ メモリの問題に使用できるデバッグ オプションの詳細については、malloc デバッグと libc コールバックを使用したネイティブ メモリ トラッキングをご覧ください。
libmemunreachable
Android の libmemunreachable を使用すると、オーバーヘッドがゼロのネイティブ メモリリークを検出できます。精密でないマークアンドスイープ ガベージ コレクタパスをすべてのネイティブ メモリ上で使用し、到達不能なブロックをリークとして報告します。使用方法については、libmemunreachable のドキュメントをご覧ください。
malloc フック
独自のツールをビルドする場合、Android の libc は、プログラムの実行中に発生するすべての割り当て / フリーコールのインターセプトもサポートしています。使用方法については、malloc_hooks のドキュメントをご覧ください。
malloc 統計情報
Android は、<malloc.h>
に対する mallinfo(3)
および malloc_info(3)
拡張機能をサポートしています。malloc_info
関数は、Android 6.0(Marshmallow)以上で利用できます。その XML スキーマは、Bionic の <malloc.h>
に記載されています。
Dalvik Debug Monitor Server
Dalvik Debug Monitor Server(DDMS)を使用して、Malloc デバッグの出力をグラフィカル表示することもできます。
DDMS を使用するには、まずネイティブ メモリ UI を有効にします。
~/.android/ddms.cfg
を開きます。native=true
の行を追加します。
DDMS を再起動してプロセスを選択すると、新しいネイティブ割り当てタブに切り替えて、割り当てのリストを入力できます。これは、特にメモリリークのデバッグで役立ちます。