NDK Androida obsługuje narzędzie HWAddress Sanitizer (znane też jako HWASan). Początek z NDK r21 i Androidem 10 (poziom API 29). HWASan jest dostępny tylko w wersjach 64-bitowych Włącz alarm urządzeń.
HWASan to narzędzie do wykrywania błędów pamięci podobne do ASan. W porównaniu do klasyki ASan i HWASan:
- Podobny narzut procesora (ok. 2x)
- Narzut związany z podobnym rozmiarem kodu (40–50%)
- Znacznie mniejszy narzut pamięci RAM (10% –35%)
HWASan wykrywa ten sam zestaw błędów co ASan:
- Przepełnienie lub niedopełnienie bufora stosu i sterty
- Wykorzystanie sterty po bezpłatnym
- Użycie stosu poza zakresem
- Podwójne wolne lub dzikie
Dodatkowo HWASan wykrywa również:
- Wykorzystanie stosu po zwrocie
Przykładowa aplikacja
Przykładowa aplikacja pokazuje, jak skonfigurować wariant kompilacji dla Hwasan.
Budowanie
Aby utworzyć natywny kod aplikacji (JNI) za pomocą narzędzia HWAddress Sanitizer, wykonaj :
ndk-build
W pliku Application.mk
:
APP_STL := c++_shared # Or system, or none, but not c++_static.
APP_CFLAGS := -fsanitize=hwaddress -fno-omit-frame-pointer
APP_LDFLAGS := -fsanitize=hwaddress
CMake
W pliku build.gradle
modułu:
android {
defaultConfig {
externalNativeBuild {
cmake {
# Can also use system or none as ANDROID_STL, but not c++_static.
arguments "-DANDROID_STL=c++_shared"
}
}
}
}
W przypadku każdego elementu docelowego w pliku CMakeLists.txt:
target_compile_options(${TARGET} PUBLIC -fsanitize=hwaddress -fno-omit-frame-pointer)
target_link_options(${TARGET} PUBLIC -fsanitize=hwaddress)
Jeśli masz subskrypcję NDK 27 lub nowszą, w build.gradle
możesz też używać tych elementów
i nie musisz zmieniać pliku CMakeLists.txt:
android {
defaultConfig {
externalNativeBuild {
cmake {
arguments "-DANDROID_SANITIZE=hwaddress"
}
}
}
}
Ta funkcja nie będzie działać podczas korzystania z: ANDROID_USE_LEGACY_TOOLCHAIN_FILE=false
.
Android 14 lub nowszy: dodaj plik wrap.sh
Jeśli masz Androida 14 lub nowszego, możesz użyć skryptu wrap.sh, aby uruchomić aplikację debuggable w dowolnym miejscu Urządzenie z systemem Android. Możesz pominąć ten krok, jeśli zdecydujesz się wykonać podane niżej czynności w instrukcjach konfiguracji.
Postępuj zgodnie z instrukcjami, aby:
spakuj skrypt wrap.sh, aby dodać do
ten skrypt wrap.sh dla domeny arm64-v8a
.
#!/system/bin/sh
LD_HWASAN=1 exec "$@"
Uruchom
Jeśli używasz Androida w wersji starszej niż 14 lub nie masz dodanego pliku wrap.sh skryptu, wykonaj instrukcje konfiguracji, zanim uruchomisz aplikację.
Uruchom aplikację tak jak zwykle. W przypadku wykrycia błędu pamięci aplikacja ulega awarii,
SIGABRT i drukuje szczegółowy komunikat dla logcat. Kopia wiadomości może
znajduje się w pliku pod adresem /data/tombstones
i wygląda tak:
ERROR: HWAddressSanitizer: tag-mismatch on address 0x0042a0826510 at pc 0x007b24d90a0c
WRITE of size 1 at 0x0042a0826510 tags: 32/3d (ptr/mem) in thread T0
#0 0x7b24d90a08 (/data/app/com.example.hellohwasan-eRpO2UhYylZaW0P_E0z7vA==/lib/arm64/libnative-lib.so+0x2a08)
#1 0x7b8f1e4ccc (/apex/com.android.art/lib64/libart.so+0x198ccc)
#2 0x7b8f1db364 (/apex/com.android.art/lib64/libart.so+0x18f364)
#3 0x7b8f2ad8d4 (/apex/com.android.art/lib64/libart.so+0x2618d4)
0x0042a0826510 is located 0 bytes to the right of 16-byte region [0x0042a0826500,0x0042a0826510)
allocated here:
#0 0x7b92a322bc (/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so+0x212bc)
#1 0x7b24d909e0 (/data/app/com.example.hellohwasan-eRpO2UhYylZaW0P_E0z7vA==/lib/arm64/libnative-lib.so+0x29e0)
#2 0x7b8f1e4ccc (/apex/com.android.art/lib64/libart.so+0x198ccc)
Po komunikacie mogą pojawiać się dodatkowe informacje na potrzeby debugowania, w tym lista aktywnych wątków w aplikacji, tagi pobliskich alokacji pamięci oraz Wartości rejestru procesora.
Więcej informacji o błędach HWASan znajdziesz w artykule Omówienie raportów HWASan. wiadomości.
Tworzenie plików wykonywalnych wiersza poleceń
Na Androidzie 14 i Androidzie 14 można tworzyć i uruchamiać pliki wykonywalne z wykorzystaniem HWASan nowszą. Możesz użyć tej samej konfiguracji opisanej w sekcji Tworzenie dla ndk-build lub CMake dla plików wykonywalnych. Przekazywanie plików wykonywalnych na urządzenie z Androidem 14 lub nowszym i uruchamiaj go normalnie, używając powłoki.
Jeśli używasz libc++, upewnij się, że używasz udostępnionego STL, i przekaż go do
na urządzeniu i ustaw LD_LIBRARY_PATH
na katalog, który je zawiera,
uruchomienia pliku binarnego.
Jeśli nie używasz Gradle, zapoznaj się z dokumentacją NDK, aby dowiedzieć się, jak tworzyć na podstawie wiersza poleceń CMake ndk-build.
Android 13 lub starszy: konfiguracja
Jeśli masz urządzenie z Androidem 14 lub nowszym, możesz pominąć ten krok i wykonać instrukcje korzystania z pliku wrap.sh w sekcji Kompilacja poniżej. Możesz też skorzystać z tej sekcji i pominąć instrukcje wrap.sh poniżej.
W wersjach starszych niż Android 14 aplikacje HWASan do uruchamiania wymagają kompilacji HWASan na Androida. Na obsługiwanych urządzeniach Pixel możesz flashować gotowe obrazy HWASan. Te konstrukcje są dostępny na ci.android.com, gdzie możesz kliknąć kwadrat oznaczający dokładną kompilację, którą chcesz uzyskać link do kompilacji Flash. W tym celu musisz znać kryptonim swojego telefonu.
Może być prościej przejść bezpośrednio na stronę flash.android.com, ponieważ tam jest proces rozpoczyna się od wykrycia urządzenia i pojawi się tylko te kompilacje, których możesz użyć. Poniższe obrazy ilustrują proces konfiguracji tego narzędzia.
Włącz na urządzeniu tryb programisty i połącz je z komputerem za pomocą kabla USB. Kliknij Dodaj nowe urządzenie, wybierz swoje urządzenie w oknie. kliknij Połącz.
Po połączeniu urządzenia kliknij je, aby skonfigurować kompilację.
W polu Wybierz identyfikator kompilacji kliknij aosp-master-with-phones-throttled
gałąź, aby automatycznie wybrać właściwy obraz dla posiadanego urządzenia.
– podłączono
Kliknij Zainstaluj, by zainstalować aktualizację.
Więcej informacji o niezbędnej konfiguracji znajdziesz w Dokumentacja Android Flash Tool Możesz też sprawdzić Dokumentacja AOSP zawiera instrukcje tworzenia obrazu HWASan ze źródła.