ネイティブ メモリの使用状況をデバッグする

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 を有効にします。

  1. ~/.android/ddms.cfg を開きます。
  2. native=true の行を追加します。

DDMS を再起動してプロセスを選択すると、新しいネイティブ割り当てタブに切り替えて、割り当てのリストを入力できます。これは、特にメモリリークのデバッグで役立ちます。