Android : Wie die analyse der native heap-dump?
Habe ich eine native heap-dump-Datei mit dem Befehl dumpheap -n <PID> <file>
. Die Datei ist in menschenlesbarem format aus, enthält aber Informationen, die zu schwer zu verstehen. Wie kann ich das analysieren dieser Datei und erhalten nützliche Informationen aus ihm heraus?
Die Funktion Adresse in dem Ort, der Funktion Namen. Die Zuordnung wird am Ende der Datei. Gibt es eine tool, um anzeigen diese und aussagekräftige Ausgang mit Funktion/lib-Namen anstelle von Adressen (laden der Symbole für Bibliotheken/Funktionen). Wenn es nicht wie funktioniert dann ddms tun? Auch gewusst wie: laden Sie die Symbole, um die Funktion anzuzeigen-Namen?
Gibt es irgendeine Möglichkeit, dass ich den Vergleich von zwei oder mehr native heap-dumps?
Den dump-heap-Datei, die ich bekam sieht so aus
Android Native Heap-Dump v1.0
Speicher Gesamt: 13863984
Zuordnung von Datensätzen: 3108
z 1 sz 8388608 num 1 bt 40afcd1a 40afbc0e 40119d30 40795210 407a9bae 407941a0 4076c264 40770b6c 407a47f4 407a481e 40786d44 407a6da6 407a800e 407a58c4 407a820a 40798ac8 40115bb4 4011530c
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
Was sind diese zahlen angibt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Daten erzeugt wird, die durch die
dumpNativeHeap()
Funktion in android_os_Debug.cpp. Jeder Eintrag ist eine Zuordnung Datensatz, der enthält:z 0
bedeutet die Aufteilung wurde durchgeführt, in der zygote-Prozess,z 1
bedeutet, es war ein Kind der zygote (D. H. eine app Prozess nach derfork()
). Dies ist nützlich für die Bestimmung, ob eine bestimmte Aufteilung kann von mehreren Prozessen aufgrund von copy-on-write.Die Adressen sind nicht sinnvoll, ohne eine Kopie von
/proc/<pid>/maps
um zu sehen, was Binärdateien abgebildet waren wo, so eine Kopie ist am Ende.Das grundlegende Werkzeug für die Umwandlung von Binär + Adresse symbol ist addr2line. Sie müssen subtrahieren Sie die Basis-Adresse der Bibliothek, die von der Adresse in dem stack-trace, um die Bibliothek versetzt.
Es ist ein einfacher Weg. Der gleiche Mechanismus, der verwendet wird zum generieren dieser heap-dumps können auch verwendet werden, um zu füttern, das DDMS Native Heap-Tracker. Es bietet eine vollständige Benutzeroberfläche zum durchsuchen der Inhalte auf dem nativen heap. Sie finden mehr Informationen über ihn hier und hier.
FWIW, hier ist ein Beispiel, es zu tun, den "harten Weg". Ich warf den Haufen der Kalender-app und sah diese Zeile:
Die relevanten Zeilen aus der maps-Eintrag:
Die Basis-Adresse der Bibliothek, die abgezogen werden müssen, die von der Adresse in dem backtrace. Sie herausfinden, welche Bibliothek es ist durch das finden der maps-Eintrag mit einem Adressbereich, der enthält die backtrace-Adresse. Arbeiten Sie von Links nach rechts (oben auf dem Aufruf-stack nach unten):
...und so weiter. Diese Spur entspricht einer Zeile in
dalvik/vm/compiler/Compiler.cpp
:addr2line -C -f -e /symbols/libexample.so 000c3ed2
wo die Adresse ist 5d6c3ed2 und bei der Nullstellung aus der hohen 12 bit bekomme ich 000c3ed2. Ich habe versucht, sowohl aus der DDMS-Benutzeroberfläche und über die Befehlszeile. Ich klickte auf export-Daten aus der nativen heap tab. In diesem allocations.txt die Datei bekomme ich die Zuordnung, wie 5d6c3ed2 /data/data/libexample.so --- Animate(): 15 ---. Aber als ich versuchte, die oben genannten Befehl bekomme ich 00:? Bitte helfen Sie mir.!!!/proc/[pid]/maps
Abschnitt. (Scheint online unter linux.die.net/man/5/proc .) Adresse Einstellung: mein Rat ist, nicht mehr richtig -- Bibliotheken sind nun zugeordnet, in feiner-granulare Grenzen. Ich werde aktualisieren, die Antwort mit einem vollständigen Beispiel.dumpheap -n <PID> <file>
. Ich finde einen großen Unterschied in ihm. Die heap-Daten, die aus den DDMS UI enthält mehr Datensätze als die heap erhalten von der Befehlszeile aus. Es ist ein Unterschied von sogar 400 Datensätze. Warum finden wir einen signifikanten Unterschied zwischen den beiden, wenn die beiden nicht die gleiche Arbeit ?get_malloc_leak_info()
aus dem bionic malloc debugging-code. Sie bekommen es über verschiedene Wege, aber ich hätte nicht erwartet, dass der Unterschied signifikant wird.addr2line -C -f -e /symbols/libanimate.so 466d0
bekomme ich die Ausgabe wie $t-und /../../../Animation.cpp:114. Aber DDMS zeigt die korrekte Ausgabe wie "Paint ()" und /../../../Animation.cpp:114.