Gdy narzędzie HWASan wykryje błąd w pamięci, proces kończy się kodem abort()
,
a raport jest wydrukowany do stderr i logcat. Podobnie jak w przypadku wszystkich awarii natywnych w Androidzie, błędy HWASan mogą
znaleziono w grupie /data/tombstones
.
W porównaniu ze zwykłymi awariami natywnymi HWASan przenosi dodatkowe informacje w polu „Przerwanie wiadomości”. na szczycie nagrobka. Zobacz poniżej przykładową awarię opartą na stercie (informacje o błędach stosu znajdziesz w uwagach poniżej).
Przykładowy raport
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** Build fingerprint: 'google/flame_hwasan/flame:Tiramisu/MASTER/7956676:userdebug/dev-keys' Revision: 'DVT1.0' ABI: 'arm64' Timestamp: 2019-04-24 01:13:22+0000 pid: 11154, tid: 11154, name: sensors@1.0-ser >>> /vendor/bin/hw/android.hardware.sensors@1.0-service <<< signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr -------- Abort message: '==9569==ERROR: HWAddressSanitizer: tag-mismatch on address 0x00433ae20045 at pc 0x00623ae2a9cc READ of size 1 at 0x00433ae20045 tags: 5b/83 (ptr/mem) in thread T0 #0 0x7240450c68 (/system/lib64/vndk-sp-R/libcutils.so+0x8c68) #1 0x723dffd490 (/vendor/lib64/sensors.ssc.so+0x34490) #2 0x723e0126e0 (/vendor/lib64/sensors.ssc.so+0x496e0) [...] [0x00433ae20040,0x00433ae20060) is a small unallocated heap chunk; size: 32 offset: 5 Cause: use-after-free 0x00433ae20045 is located 5 bytes inside of 10-byte region [0x00433ae20040,0x00433ae2004a) freed by thread T0 here: #0 0x72404d1b18 (/system/lib64/libclang_rt.hwasan-aarch64-android.so+0x10b18) #1 0x723af23040 (/vendor/lib64/libgralloccore.so+0x5040) #2 0x723af23fa4 (/vendor/lib64/libgralloccore.so+0x5fa4) [...] previously allocated here: #0 0x72404ce554 (/system/lib64/libclang_rt.hwasan-aarch64-android.so+0xd554) #1 0x7240115654 (/apex/com.android.runtime/lib64/bionic/libc.so+0x43654) #2 0x7240450ac8 (/system/lib64/vndk-sp-R/libcutils.so+0x8ac8) [...] hwasan_dev_note_heap_rb_distance: 1 1023 hwasan_dev_note_num_matching_addrs: 0 hwasan_dev_note_num_matching_addrs_4b: 0 Thread: T0 0x006a00002000 stack: [0x007fc1064000,0x007fc1864000) sz: 8388608 tls: [0x00737702ffc0,0x007377033000) Memory tags around the buggy address (one tag corresponds to 16 bytes): 0x006f33ae1f80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1f90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1fa0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae1ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 =>0x006f33ae2000: 08 00 08 00 [83] 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x006f33ae2080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Tags for short granules around the buggy address (one tag corresponds to 16 bytes): 0x006f33ae1ff0: .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. =>0x006f33ae2000: 72 .. d0 .. [..] .. .. .. .. .. .. .. .. .. .. .. 0x006f33ae2010: .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. See https://clang.llvm.org/docs/HardwareAssistedAddressSanitizerDesign.html#short-granules for a description of short granule tags Registers where the failure occurred (pc 0x00623ae2a9cc): x0 0000007fc18623ec x1 5b0000433ae20045 x2 0000000000000013 x3 ffffffffffffffff x4 ffffffffffffffff x5 0000007fc1861da3 x6 6f7420676e696f47 x7 45522061206f6420 x8 0000000000000000 x9 0200006b00000000 x10 00000007fc18623f x11 5b0000433ae20040 x12 6f64206f7420676e x13 0a44414552206120 x14 0000000000000010 x15 ffffffffffffffff x16 000000737169ac94 x17 0000000000000007 x18 0000007377bd8000 x19 0000007fc1862498 x20 0200006b00000000 x21 0000007fc18624a8 x22 0000000000000001 x23 0000000000000000 x24 0000000000000000 x25 0000000000000000 x26 0000000000000000 x27 0000000000000000 x28 0000000000000000 x29 0000007fc1862410 x30 000000623ae2a9d0 sp 0000007fc18623d0 SUMMARY: HWAddressSanitizer: tag-mismatch (/system/lib64/vndk-sp-R/libcutils.so+0x8c68) [ … regular crash dump follows …]
Jest to bardzo podobne do raportu AddressSanitizer. W przeciwieństwie do nich niemal wszystkie błędy HWASan to „niezgodność tagów”, czyli dostęp do pamięci, gdy tag wskaźnika nie pasuje do odpowiedniego tagu pamięci. Może to być jeden z tych elementów:
- dostęp poza granicami na stosie lub stercie
- użyj po bezpłatnym na stercie
- użyj po zwrocie na stos
Sekcje
Poniżej znajdziesz objaśnienia poszczególnych sekcji raportu HWASan:
Błąd dostępu
Zawiera informacje o nieprawidłowym dostępie do pamięci, w tym:
- Typ dostępu („READ” czy „WRITE”)
- Rozmiar dostępu (liczba bajtów, do których próbowano uzyskać dostęp)
- Numer wątku z dostępem
- Tagi wskaźnika i pamięci (do zaawansowanego debugowania)
Dostęp do zrzutu stosu
Zrzut stosu z nieprawidłowym dostępem do pamięci. W sekcji symbolizacji znajdziesz informacje, i symbolizować.
Przyczyna
Możliwa przyczyna nieprawidłowego dostępu. Jeśli jest wielu kandydatów, to są wymienione w kolejności malejącej. poprzedza szczegółowe informacje na temat funkcji potencjalnej przyczyny. HWASan może zdiagnozować następujące przyczyny:
- używaj po bezpłatnym
- stack tag-mismatch: może to być użycie stosu po zwrocie / użycie po zakresie lub poza granicami
- przepełnienie bufora sterty
- global-overflow,
Informacje o pamięci
Opisuje, co HWASan wie o używanej pamięci, i może się różnić. na podstawie typ błędu.
Rodzaj błędu | Przyczyna | Format raportu |
---|---|---|
niezgodność tagu | używaj po bezpłatnym |
<address> is located N bytes inside of M-byte region [<start>, <end>) freed by thread T0 here: |
przepełnienie bufora sterty | Pamiętaj, że może to być również niedopełnienie.
<address> is located N bytes to the right of M-byte region [<start>, <end>) allocated here: |
|
niezgodność tagów stosu | W raportach dotyczących stosu nie następuje rozróżnienie między nadmiarem/niedokładnością i po dokonaniu zwrotu. W aby znaleźć przydział stosu, który jest źródłem błędu, offline wymagany jest krok symbolizacji. Przeczytaj artykuł Omówienie raportów stosu. sekcji poniżej. | |
bez błędów | używaj po bezpłatnym | To jest podwójny bezpłatny błąd. Jeśli nastąpi to przy zamykaniu procesu, może to oznaczać, że
Naruszenie zasad dotyczących RDR.
<address> is located N bytes inside of M-byte region [<start>, <end>) freed by thread T0 here: |
nie można opisać adresu | Wartość wolna od wartości „wild” (wolna od pamięci, która nie była wcześniej przydzielana) albo podwójne wolne po usunięciu przydzielonej pamięci z wolnego bufora HWASan. | |
0x... to pamięć cieni HWAsan. | Nie jest to obce, bo aplikacja próbowała zwolnić pamięci, która jest wewnętrzne w HWASan. |
Zrzut stosu umowy
Zrzut stosu przedstawiający miejsce przydzielenia pamięci. Widoczne tylko do wykorzystania po bezpłatnym lub nieprawidłowe błędy. Informacje na temat symbolizacji znajdziesz w sekcji dotyczącej symboli.
Zrzut stosu alokacji
Zrzut stosu przedstawiający miejsce przydzielenia pamięci. Informacje na temat symbolizacji znajdziesz w sekcji dotyczącej symboli.
Debugowanie zaawansowane Informacje
Raport HWASan zawiera też zaawansowane informacje na potrzeby debugowania, w tym: (w kolejności):
- Lista wątków w procesie
- Lista wątków w procesie
- Wartość tagów pamięci w pobliżu uszkodzonej pamięci
- Zrzut rejestrów w punkcie dostępu do pamięci
Zrzut tagu pamięci
Zrzutu pamięci tagu można użyć do wyszukania pobliskich alokacji pamięci z tym samym tagiem jako wskaźnik . Mogą one wskazywać na dostęp spoza granic z dużym przesunięciem. 1 tag odpowiada 16 B pamięci; tag wskaźnika to górne 8 bitów adresu. Zrzut pamięci tagów może dawać wskazówki, w przypadku przykład to jest nadmiar bufora w prawo:
tags: ad/5c (ptr/mem) [...] Memory tags around the buggy address (one tag corresponds to 16 bytes): 0x006f33ae1ff0: 0e 0e 0e 57 20 20 20 20 20 2e 5e 5e 5e 5e 5e b5 =>0x006f33ae2000: f6 f6 f6 f6 f6 4c ad ad ad ad ad ad [5c] 5c 5c 5c 0x006f33ae2010: 5c 04 2e 2e 2e 2e 2e 2f 66 66 66 66 66 80 6a 6a Tags for short granules around the buggy address (one tag corresponds to 16 bytes): 0x006f33ae1ff0: ab 52 eb .. .. .. .. .. .. .. .. .. .. .. .. .. =>0x006f33ae2000: .. .. .. .. .. .. .. .. .. .. .. .. [..] .. .. .. 0x006f33ae2010: .. 5c .. .. .. .. .. .. .. .. .. .. .. .. .. ..(zwróć uwagę, że tagi „ad” zawierają po lewej stronie rozmiar 6 × 16 = 96 bajtów, które odpowiadają tagowi wskaźnika).
Jeśli rozmiar alokacji nie jest wielokrotnością liczby 16, pozostała część rozmiaru jest zapisane jako tag pamięci, a tag będzie przechowywany jako krótki tag granule. W przykładzie powyżej tuż za pogrubioną alokacją otagowaną reklama, Nadaj 5 × 16 + 4 = przydział 84 bajtów dla tagu 5c.
Zerowy tag pamięci (np. tags: ad/00 (ptr/mem)
) zwykle wskazuje
„stack-use-after-return”.
Zarejestruj zrzut
Zrzut rejestru w raportach HWASan odpowiada faktycznej instrukcji wykonania nieprawidłowa pamięć dostęp. Po nim następuje kolejny zrzut rejestru ze standardowego modułu obsługi sygnałów Androida. – zignoruj , jest zapisywany, gdy HWASan wywołał funkcję abort() i nie ma znaczenia robakiem.
Symbole
Aby uzyskać nazwy funkcji i numery wierszy w zrzutach stosu (oraz uzyskać nazwy zmiennych na potrzeby użycia po zakresie) błędów), potrzebny jest krok symbolizacji offline.
Pierwsza konfiguracja: zainstaluj LLM-symbolizer
Aby można było przeprowadzić symbolizację, w systemie musi być zainstalowany program llvm-symbolizer, do którego można uzyskać dostęp z poziomu $PATH. W Debianie możesz:
zainstaluj ją za pomocą sudo apt install llvm
.
Pobieranie plików symboli
Do przekształcenia symboli wymagane są niezmienione pliki binarne zawierające symbole. To, gdzie się znajdują, zależy od tego, na temat typu kompilacji:
W przypadku kompilacji lokalnych pliki symboli znajdują się w:
out/target/product/<product>/symbols/
W przypadku kompilacji AOSP (np. flashowanej z Flashstation) parametr
i kompilacje można znaleźć w Androidzie CI. W sekcji „Artefakty” dla wartości
tworzyć,
będzie plik ${PRODUCT}-symbols-${BUILDID}.zip
.
W przypadku kompilacji wewnętrznych z organizacji zapoznaj się z jej dokumentacją w celu uzyskania plików symboli.
Symbole
hwasan_symbolize –-symbols <DECOMPRESSED_DIR>/out/target/product/*/symbols < crash
Raporty dotyczące grupowania
W przypadku błędów występujących w zmiennych stos raport HWASan będzie zawierać następujące informacje:
Cause: stack tag-mismatch Address 0x007d4d251e80 is located in stack of thread T64 Thread: T64 0x0074000b2000 stack: [0x007d4d14c000,0x007d4d255cb0) sz: 1088688 tls: [0x007d4d255fc0,0x007d4d259000) Previously allocated frames: record_addr:0x7df7300c98 record:0x51ef007df3f70fb0 (/apex/com.android.art/lib64/libart.so+0x570fb0) record_addr:0x7df7300c90 record:0x5200007df3cdab74 (/apex/com.android.art/lib64/libart.so+0x2dab74) [...]
Aby ułatwić zrozumienie błędów stosu, HWASan śledzi ramki stosu, które wystąpiły w przeszłości. Obecnie HWASan nie przekształca w raporcie o błędzie treści zrozumiałej dla człowieka. wymaga dodatkowego kroku symbolizowania.
Naruszenia zasad ODR
Niektóre błędy typu „use-after-free” zgłaszane przez HWASan mogą również wskazywać na naruszenie zasady jednej definicji (ODR). Naruszenie zasad ODR ma miejsce, gdy ta sama zmienna zostanie zdefiniowana kilka razy w tym samym programie. Oznacza to też, że zmienna jest niszczona wielokrotnie, co może prowadzić do „use-after-free”.
Po przekształceniu symbolizacji w przypadku naruszeń ODR, w przypadku zasad __cxa_finalize
, pojawia się informacja „używanie po zwolnieniu”.
zarówno w stosie nieprawidłowych dostępu, jak i w stosie „zwolniono tutaj”, stosów. „Przydzielone wcześniej
tutaj” stos zawiera __dl__ZN6soinfo17call_constructorsEv
i powinien
na lokalizację w programie, która definiuje zmienną wyżej na stosie.
Jednym z powodów naruszenia prawa ODR może być korzystanie z bibliotek statycznych. Jeśli biblioteka statyczna, która definiuje zasób globalny C++, jest połączona z wieloma bibliotekami udostępnionymi lub pliki wykonywalne, wiele definicji tego samego symbolu może zostać istniejących pod tym samym adresem co spowoduje błąd ODR.
Rozwiązywanie problemów
HWAddressSanitizer nie może bardziej szczegółowo opisać adresu
Czasami HWASan może zabraknąć miejsca na informacje o wcześniejszych przydziałach pamięci. W takim przypadku raport zawiera tylko 1 zrzut stosu umożliwiający bezpośredni dostęp do pamięci, po którym następuje uwaga:
HWAddressSanitizer can not describe address in more detail.
W niektórych przypadkach możesz rozwiązać ten problem, wykonując test kilka razy. Inną opcją jest zwiększenie liczby HWASan
rozmiaru historii. Można to zrobić globalnie w
build/soong/cc/sanitize.go
(szukaj
hwasanGlobalOptions
) lub w swoim środowisku procesów (wypróbuj
adb shell echo $HWASAN_OPTIONS
, aby zobaczyć bieżące ustawienia).
Może się tak również zdarzyć, jeśli pamięć, do której uzyskano dostęp, nie jest zmapowana lub przydzielona przez platformę niezidentyfikowaną przez HWASan
alokatora. W takim przypadku tag mem
wymieniony w nagłówku awarii będzie zwykle
00
Jeśli masz dostęp do całego nagrobka, pomocne mogą być informacje
zrzutu pamięci, aby sprawdzić, do którego mapowania (jeśli w ogóle) należy adres.
Błąd zagnieżdżony w tym samym wątku
Oznacza to, że podczas generowania raportu o awariach HWASan wystąpił błąd. Jest to zwykle spowodowane błędem w W środowisku wykonawczym HWASan zgłoś błąd. podać instrukcje, jak odtworzyć problem, jeśli to możliwe.