Native Arbeitsspeichernutzung beheben

Address Sanitizer: HWASan/ASan

Entwickler der Android-Plattform verwenden HWAddressSanitizer (HWASan), um Speicherfehler in C/C++ zu finden.

Sie können vorgefertigte HWASan-Images auf unterstützte Pixel-Geräte flashen. Die Images sind unter ci.android.com verfügbar (detaillierte Einrichtungsanleitung).

Seit Android 8.0 (Oreo) ist es auch möglich, ASan zum Debuggen von Apps auf nicht gerooteten Produktionsgeräten zu verwenden. Eine Anleitung dazu finden Sie im ASan-Wiki.

Heapprofd

Android 10 unterstützt heapprofd, einen Sampling-Heap-Profiler mit geringem Overhead. Mit heapprofd können Sie die native Arbeitsspeichernutzung Callstacks in Ihrem Programm zuordnen. Weitere Informationen finden Sie in der Perfetto-Dokumentation unter heapprofd – Android Heap Profiler.

Malloc Debug

Eine ausführliche Beschreibung der Debugging-Optionen für Probleme mit dem nativen Arbeitsspeicher finden Sie unter Malloc Debug und Native Memory Tracking using libc Callbacks.

libmemunreachable

libmemunreachable für Android ist ein nativer Speicherleck-Detektor ohne zusätzlichen Aufwand. Es wird ein ungenauer Mark-and-Sweep-Garbage-Collector-Pass für den gesamten nativen Speicher verwendet, bei dem alle nicht erreichbaren Blöcke als Lecks gemeldet werden. Eine Anleitung zur Verwendung finden Sie in der Dokumentation zu libmemunreachable.

Malloc-Hooks

Wenn Sie eigene Tools entwickeln möchten, unterstützt die libc von Android auch das Abfangen aller Zuweisungs-/Freigabeaufrufe, die während der Programmausführung erfolgen. Eine Anleitung zur Verwendung finden Sie in der Dokumentation zu malloc_hooks.

Malloc-Statistiken

Android unterstützt die Erweiterungen mallinfo(3) und malloc_info(3) für <malloc.h>. Die Funktion malloc_info ist ab Android 6.0 (Marshmallow) verfügbar. Das zugehörige XML-Schema ist in der <malloc.h> von Bionic dokumentiert.

Dalvik Debug Monitor Server

Sie können auch den Dalvik Debug Monitor Server (DDMS) verwenden, um eine grafische Darstellung der Malloc Debug-Ausgabe zu erhalten.

Wenn Sie DDMS verwenden möchten, müssen Sie zuerst die Benutzeroberfläche für den nativen Speicher aktivieren:

  1. ~/.android/ddms.cfg öffnen
  2. Fügen Sie die Zeile native=true hinzu.

Wenn Sie DDMS neu starten und einen Prozess auswählen, können Sie zum neuen Tab für die native Zuweisung wechseln und ihn mit einer Liste von Zuweisungen füllen. Das ist besonders nützlich, um Speicherlecks zu debuggen.