Raporty HWASan

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: '

[...]

[0x00433ae20040,0x00433ae20060) is a small unallocated heap chunk; size: 32 offset: 5








[ … 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):

  1. Lista wątków w procesie
  2. Lista wątków w procesie
  3. Wartość tagów pamięci w pobliżu uszkodzonej pamięci
  4. 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.