Debugowanie uszkodzenia pamięci za pomocą narzędzia Address Sanitizer

W tym dokumencie opisujemy, jak włączyć specjalne narzędzia do debugowania, gdy korzystasz z AGDE, Te narzędzia mogą pomóc z trudną do zdiagnozowania pamięcią uszkodzone i błędy nadpisania.

Sanitizer i sanializator adresów HWAddress

HWAddress Sanitizer (HWASan) i Address Sanitizer (ASan) to narzędzia do debugowania błędów pamięci, pomoc w debugowaniu uszkodzenia pamięci i błędów nadpisywania, takich jak :

  • Przepełnienia bufora stosu i niedostateczne przepływy
  • Przepełnienia bufora sterty i niedostateczne przepływy
  • Użycie stosu poza zakresem
  • Podwójne błędy wolne i bezpłatne
  • Wykorzystanie stosu po zwrocie (tylko HWASan)
.

Zalecamy włączanie HWASan lub ASan tylko podczas debugowania problemu lub które są częścią automatycznego testowania. Chociaż narzędzia te są bardzo skuteczne, nałożyć karę.

Działanie środowiska wykonawczego

Gdy ta opcja jest włączona, HWASan i ASan automatycznie sprawdzają, czy występuje uszkodzenie pamięci całe środowisko wykonawcze aplikacji.

Jeśli zostanie wykryty błąd pamięci, aplikacja ulega awarii i powoduje przerwanie sygnału SIGBART. i wyświetli szczegółowy komunikat do dziennika. Kopia wiadomości to również zapisane w pliku pod adresem /data/tombstones.

Komunikat o błędzie wygląda mniej więcej 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)

Wymagania wstępne

Instalowanie kompilacji systemu HWASan systemu operacyjnego Android

Aby zacząć korzystać z HWASan, postępuj zgodnie z instrukcjami konfiguracji w Dokumentacja HWASan na temat instalowania kompilacji HWASan systemu operacyjnego Android dla Google Urządzenia Pixel.

W przypadku innych urządzeń skontaktuj się z producentem, aby uzyskać kompilację oprogramowania HWASan systemu operacyjnego, jeśli jest dostępny, lub użyć wyłącznie programowego narzędzia ASan.

Używanie udostępnionej biblioteki standardowej C++ w projekcie

Z powodu znanego problemu ASan jest niezgodny z obsługą wyjątków w C++, gdy: za pomocą funkcji libc++_static. Ten problem nie występuje podczas korzystania z usługi libc++_shared.

HWASan ma własną implementację operatorów new i delete, które nie mogą: należy używać, jeśli biblioteka standardowa jest statycznie połączona z projektem.

Aby zmienić to ustawienie, zobacz Łączenie ze standardową biblioteką C++ w tym dokumencie.

Włącz generowanie wskaźnika ramki

Do generowania zrzutu stosu HWASan i ASan używają narzędzia do rozwijania szybkiego obrazu opartego na wskaźniku klatek informacje o zdarzeniach alokacji pamięci i alokacji pamięci. Oznacza to, że musisz muszą włączyć generowanie wskaźnika ramek w ustawieniach kompilatora C++, aby używać tych funkcje zabezpieczeń. Musisz wyłączyć optymalizację pomijania wskaźnika klatek.

Aby zmienić to ustawienie, zapoznaj się z sekcją Włączanie wskaźnika ramki generowanie w tym dokumencie.

Konfigurowanie projektu Visual Studio pod kątem używania HWASan lub ASan

Włączanie HWASan lub ASan

Aby włączyć HWASan lub ASan, otwórz Właściwości konfiguracji > Ogólne w Strony usługi w projekcie.

Menu właściwości Eksploratora rozwiązań Visual Studio dla bieżącego
w projektach AI.

Rysunek 1. Opcja Właściwości projektu w rozwiązaniu Visual Studio Okno eksploratora.

Okno dialogowe Strony właściwości projektu z wyświetlonymi właściwościami ogólnymi i adresem.
Wyróżnione ustawienia dezynfekcji.

Rysunek 2. Ustawienie Address Sanitizer (ASan) w projekcie ogólnym usług.

Aby włączyć HWASan w projekcie, zmień Address Sanitizer (ASan). Ustawienie na Włączono sprzęt ASan (fsanitize=hwaddress).

Aby włączyć ASan w projekcie, zmień ustawienie Address Sanitizer (ASan). na ASan Enabled (fsanitize=address).

Włączanie generowania wskaźnika klatek

Generowanie wskaźnika klatki jest sterowane przez pominięcie wskaźnika ramki C/C++ kompilatora. Możesz go znaleźć na stronach usługi w sekcji Właściwości konfiguracji > C/C++ > Optymalizacja.

Okno dialogowe strony właściwości projektu z wyświetlonymi właściwościami optymalizacji C/C++.
i Pomiń wskaźnik klatki.
wyróżniona.

Rysunek 3. Gdzie znaleźć ustawienie Pomiń wskaźnik ramki

Jeśli używasz HWASan lub ASan, wybierz dla ustawienia Pomiń wskaźnik klatki na Nie (-fno-omit-frame-pointer).

Łączenie standardowej biblioteki C++ w trybie biblioteki udostępnionej

Ustawienie trybu kreatora linków dla Biblioteki standardowej C++ znajdziesz w Strony usługi projektu w sekcji Właściwości konfiguracji > General w w sekcji Ustawienia domyślne projektu.

Okno właściwości projektu z wybraną kategorią Ogólne oraz
Korzystanie z ustawień STL
wyróżniona.

Rysunek 4. Gdzie znaleźć ustawienie trybu kreatora linków w bibliotece standardowej C++

Jeśli używasz HWASan lub ASan, ustaw Użycie języka STL w celu używania bibliotek standardowych C++ (.so). Łączy ona język C++ biblioteki standardowej do projektu jako biblioteki współdzielonej, co jest wymagane HWASan i ASan, aby działać prawidłowo.

Tworzenie konfiguracji kompilacji na potrzeby usługi Address Sanitizer

Jeśli wolisz tymczasowo używać HWASan lub ASan, nie warto tworzyć nową konfigurację kompilacji wyłącznie do ich użytku. Może tak być, jeśli jest mały, badasz daną funkcję lub robisz to w odpowiedzi na problem, które można wykryć podczas testowania.

Jeśli jednak okaże się przydatny i planujesz regularnie go używać, utworzenie nowej konfiguracji kompilacji dla HWASan lub ASan, jak pokazano w Próbka herbaty. Możesz to zrobić, jeśli na przykład regularnie uruchamiasz Address Sanitizer w ramach testów jednostkowych lub testów dymu z gry w nocy.

Utworzenie osobnej konfiguracji kompilacji może być przydatne, jeśli masz który wykorzystuje wiele różnych bibliotek zewnętrznych gdzie statycznie łączysz je ze standardową biblioteką w C++. Dedykowany konfiguracje kompilacji mogą pomóc zapewnić, że ustawienia projektu pozostaną niezmienione. przez cały czas być dokładne.

Aby utworzyć konfigurację kompilacji, na stronie Strony usługi w projekcie kliknij Menedżer konfiguracji..., a następnie otwórz Menu Aktywne rozwiązanie. Następnie zaznaczenie , a utwórz nową konfigurację kompilacji o odpowiedniej nazwie (na przykład HWASan). włączona).