2

コマンドを使用して、ネイティブ ヒープ ダンプ ファイルを作成しましたdumpheap -n <PID> <file>。ファイルは人間が読める形式ですが、理解するのが難しすぎる情報が含まれています。このファイルを分析して有益な情報を得るにはどうすればよいですか?

関数アドレスは、関数名の代わりに提供されます。マッピングはファイルの下部に記載されています。これらをマップし、アドレスの代わりに関数/ライブラリ名を使用して意味のある出力を提供するツールはありますか (ライブラリ/関数のシンボルをロードします)。存在しない場合、ddms はどのようにこれを行うのでしょうか? また、シンボルをロードして関数名を表示する方法は?

2 つ以上のネイティブ ヒープ ダンプを比較する方法はありますか?

取得したダンプ ヒープ ファイルは次のようになります

Android ネイティブ ヒープ ダンプ v1.0

合計メモリ: 13863984 割り当てレコード: 3108

Z 1 SZ 8388608 NUM 1 BT 40AFCD1A 40AFBC0E 40119D30 40795210 407A9BAE 407941A0 4076C264 40770B6C 407A47F4 407A481E 40786D44 407A6DA6 407A4800E 407584444444444444444444444444444458C4444458C4

z 1 sz 1516906 num 1 bt 40afcd1a 40afbc0e 40119d30 400658fe 402563d8 5a400b10 5d6c3ed2 5d6c3efc 5d6c3f34 5d69d556 5d6a9de0 40794664 407aafa0 4076c264 40770b6c 407a47f4 407a481e 407af4a8 407aff8c 407678b0 40770b6c 407a4aba 407ac010 4076c264 40770b6c 407a47f4 4078e676 401dd98e 401de472 4005ddd2 40119ed4

z 1 sz 262144 num 1 bt 40afcd1a 40afbc0e 40119d30 400658fe 40a14416 40a144e0 40a154a4 40a1570e 40a1d8cc 40a20d42 40a1a9e4 40a1aa26 40a1aa26 40a1aa26 40a1aa26 40a1aa26 40a1aa26 40a1aa26 401f0c90 40762e34 40792086 4076c264 40770b6c 407a4aba 407ac010 4076c264 40770b6c 407a47f4 4078e676 401dd98e 401de472 4005ddd2

z 1 sz 262144 num 1 bt 40afcd1a 40afbc0e 40119d30 400658fe 40a14416 40a144e0 40a154a4 40a1570e 40a1d8cc 40a20d42 40a1a9e4 40a1aa26 40a1aa26 40a1aa26 40a1aa26 40a1aa26 40a1aa26 40a1aa26 40a1aa26 40a1aa26 401f0c90 40762e34 40792086 4076c264 40770b6c 407a4aba 407ac010 4076c264 40770b6c 407a47f4 4078e676 401dd98e

z 1 sz 65536 num 1 bt 40afcd1a 40afbc0e 40119d30 400658fe 40a14400 40a15714 40a1d8cc 40a20d42 40a1a9e4 40a1aa26 40a1aa26 40a1aa26 40a1aa26 40a1aa26 40a1aa26 40a1aa26 401f0c90 40762e34 40792086 4076c264 40770b6c 407a4aba 407ac010 4076c264 40770b6c 407a47f4 4078e676 401dd98e 401de472 4005ddd2 40119ed4

z 1 sz 65536 num 1 bt 40afcd1a 40afbc0e 40119d30 400658fe 40a14400 40a15714 40a1d8cc 40a20d42 40a1a9e4 40a1aa26 40a1aa26 40a1aa26 40a1aa26 40a1aa26 40a1aa26 40a1aa26 40a1aa26 40a1aa26 401f0c90 40762e34 40792086 4076c264 40770b6c 407a4aba 407ac010 4076c264 40770b6c 407a47f4 4078e676 401dd98e 401de472 4005ddd2

これらの数字は何を示していますか?

4

1 に答える 1

6

データはandroid_os_Debug.cppdumpNativeHeap()の関数によって生成されています。各エントリは 1 つの割り当てレコードであり、次のものが含まれます。

  • 「zygote child」フラグ:z 0割り当てが zygote プロセスで実行されたことをz 1意味し、それが zygote の子 (つまり、 の後の app プロセスfork()) で発生したことを意味します。これは、特定の割り当てがコピーオンライトによって複数のプロセス間で共有されるかどうかを判断するのに役立ちます。
  • 割り当てのサイズ (バイト単位)。
  • サイズとバックトレースがまったく同じ割り当ての数。
  • バックトレース アドレス (最大 32)。

/proc/<pid>/mapsアドレスは、どのバイナリがどこにマップされたかを確認するためのコピーがなければ意味がないため、最後にコピーが含まれています。

バイナリ + アドレスをシンボルに変換するための基本ツールはaddr2lineです。ライブラリ オフセットを取得するには、スタック トレースのアドレスからライブラリのベース アドレスを差し引く必要があります。

もっと簡単な方法があります。これらのヒープ ダンプを生成するために使用されるのと同じメカニズムを使用して、DDMS ネイティブ ヒープ トラッカーをフィードすることもできます。これにより、ネイティブ ヒープのコンテンツを参照するための完全な UI が提供されます。詳細については、こちらこちらをご覧ください。

FWIW、これは「難しい方法」で行う例です。カレンダー アプリのヒープをダンプすると、次の行が表示されました。

z 1  sz    49152  num    1  bt b5aac102 b5aac2f6 b6f8599a b5a5e946 b5a3f268 b6f8d6a0 b6f8b83e

maps エントリの関連する行は次のとおりです。

b59ea000-b5a92000 r-xp 00000000 b3:19 817        /system/lib/libdvm.so
b5a9f000-b5ae0000 r-xp 00000000 b3:19 782        /system/lib/libc_malloc_debug_leak.so
b6f78000-b6fbf000 r-xp 00000000 b3:19 780        /system/lib/libc.so

ライブラリのベース アドレスは、バックトレースのアドレスから減算する必要があります。バックトレースアドレスを含むアドレス範囲を持つマップエントリを見つけることで、それがどのライブラリにあるかを把握します。左から右へ (コール スタックの上から下へ):

b5aac102 - b5a9f000 = d102
addr2line -C -f -e [...]/symbols/system/lib/libc_malloc_debug_leak.so d102
--> leak_malloc (malloc_debug_leak.cpp:283)

b5aac2f6...
--> leak_calloc (malloc_debug_leak.cpp:338)

b6f8599a - b6f78000 = d99a
addr2line -C -f -e [...]/symbols/system/lib/libc.so d99a
--> calloc (malloc_debug_common.cpp:231)

b5a5e946 - b59ea000 = 74946
addr2line -C -f -e [...]/symbols/system/lib/libdvm.so 74946
--> compilerThreadStartup (Compiler.cpp:434)

b5a3f268...
--> internalThreadStart(void*) (Thread.cpp:1752)

...等々。このトレースは、次の行に対応していますdalvik/vm/compiler/Compiler.cpp

pJitTable = (JitEntry*)
            calloc(gDvmJit.jitTableSize, sizeof(*pJitTable));
于 2013-11-15T23:18:53.157 に答える