Debugowanie wykorzystania pamięci natywnej

Address Sanitizer: HWASan/ASan

Deweloperzy platformy Android używają HWAddressSanitizer (HWASan) do znajdowania błędów pamięci w językach C/C++.

Gotowe obrazy HWASan możesz wgrać na obsługiwane urządzenia Pixel ze strony ci.android.com (szczegółowe instrukcje konfiguracji).

Od Androida 8.0 (Oreo) można też używać ASan do debugowania aplikacji na urządzeniach produkcyjnych bez roota. Instrukcje znajdziesz w wiki ASan.

Heapprofd

Android 10 obsługuje heapprofd, czyli profiler sterty z niskim narzutem, który działa na zasadzie próbkowania. Umożliwia on przypisywanie wykorzystania pamięci natywnej do stosów wywołań w programie. Więcej informacji znajdziesz w artykule heapprofd – profiler sterty Androidawitrynie dokumentacji Perfetto.

Debugowanie metodą malloc

Szczegółowy opis opcji debugowania problemów z pamięcią natywną znajdziesz w artykułach Debugowanie funkcji mallocŚledzenie pamięci natywnej za pomocą wywołań zwrotnych biblioteki libc.

libmemunreachable

Biblioteka libmemunreachable na Androidzie to wykrywacz wycieków pamięci natywnej o zerowym obciążeniu. Wykorzystuje on niedokładne oznaczanie i usuwanie nieużywanych obiektów w całej pamięci natywnej, zgłaszając wszystkie nieosiągalne bloki jako wycieki. Instrukcje użytkowania znajdziesz w dokumentacji biblioteki libmemunreachable.

Funkcje malloc

Jeśli chcesz tworzyć własne narzędzia, biblioteka libc w Androidzie obsługuje też przechwytywanie wszystkich wywołań funkcji przydzielania i zwalniania pamięci, które występują podczas wykonywania programu. Instrukcje użytkowania znajdziesz w dokumentacji malloc_hooks.

Statystyki malloc

Android obsługuje rozszerzenia mallinfo(3)malloc_info(3) do <malloc.h>. Funkcja malloc_info jest dostępna na Androidzie 6.0 (Marshmallow) i nowszym, a jej schemat XML jest udokumentowany w <malloc.h> Bionic.

Serwer monitora debugowania Dalvik

Możesz też użyć serwera monitora debugowania Dalvik (DDMS), aby uzyskać graficzny widok danych wyjściowych debugowania Malloc.

Aby używać DDMS, najpierw włącz jego natywny interfejs pamięci:

  1. Otwórz aplikację ~/.android/ddms.cfg
  2. Dodaj wiersz: native=true

Po ponownym uruchomieniu DDMS i wybraniu procesu możesz przejść na nową kartę alokacji natywnej i wypełnić ją listą alokacji. Jest to szczególnie przydatne podczas debugowania wycieków pamięci.