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.
Rysunek 1. Opcja Właściwości projektu w rozwiązaniu Visual Studio Okno eksploratora.
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.
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.
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