In diesem Dokument erfahren Sie, wie Sie bei der Verwendung von AGDE Diese Tools können bei schwierig zu diagnostizierenden Gedächtnissen helfen zu beschädigen und zu überschreiben.
HWAddress Sanitizer und Address Sanitizer
HWAddress Sanitizer (HWASan) und Address Sanitizer (ASan) sind Debugging-Tools für Speicherschäden, Hilfe bei der Fehlerbehebung bei Speicherbeschädigungen und zum Überschreiben von Fehlern wie dem Folgendes:
- Stack-Pufferüber- und -unterläufe
- Über- und Unterflüsse des Heap-Zwischenspeichers
- Verwendung von Stacks außerhalb seines Zuständigkeitsbereichs
- Double Free- und Wild Free-Fehler
- Stapelverwendung nach Rückgabe (nur HWASan)
Wir empfehlen, HWASan oder ASan nur zu aktivieren, wenn Sie ein Problem beheben oder im Rahmen automatisierter Tests. Diese Tools sind zwar leistungsstark, nutzen eine Strafe nach sich ziehen.
Laufzeitverhalten
Wenn diese Option aktiviert ist, prüfen HWASan und ASan automatisch, ob Speicherbeschädigungen für für die gesamte Laufzeit Ihrer App.
Wenn ein Speicherfehler erkannt wird, stürzt die App mit der Meldung SIGBART
ab (Signalabbruch).
Fehler und gibt eine detaillierte Meldung an logcat aus. Eine Kopie der Nachricht wird
auch in eine Datei unter /data/tombstones
geschrieben.
Die Fehlermeldung sieht in etwa so aus:
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)
Voraussetzungen
HWASan-Build des Android-Betriebssystems installieren
Um HWASan zu verwenden, folgen Sie der Einrichtungsanleitung im HWASan-Dokumentation zur Installation eines HWASan-Builds des Android-Betriebssystems für Google Pixel-Geräte
Wenden Sie sich bei anderen Geräten an den Hersteller, um eine HWASan-Version der Betriebssystem, falls verfügbar, oder verwenden Sie das reine Software-ASan-Tool.
Gemeinsam genutzte C++-Standardbibliothek im Projekt verwenden
Aufgrund eines bekannten Problems ist ASan nicht mit der Ausnahmebehandlung in C++ kompatibel, wenn
mit libc++_static
. Dieses Problem tritt bei der Verwendung von libc++_shared
nicht auf.
HWASan hat eine eigene Implementierung der Operatoren new
und delete
, die nicht
wird verwendet, wenn die Standardbibliothek statisch mit dem Projekt verknüpft ist.
Informationen zum Ändern dieser Einstellung finden Sie unter C++-Standardbibliothek verknüpfen. dieses Dokuments.
Framepointer-Generierung aktivieren
HWASan und ASan verwenden einen schnellen Frame-Pointer-basierten Abwickler zum Generieren von Stacktraces Informationen zu Arbeitsspeicherzuweisung und Deallocation-Ereignissen. Das bedeutet, dass Sie Sie müssen die Frame-Pointer-Generierung in Ihren C++-Compiler-Einstellungen aktivieren, um diese verwenden zu können Funktionen. Das heißt, Sie müssen die Optimierung der Frame-Pointer-Auslassung deaktivieren.
Informationen zum Ändern dieser Einstellung finden Sie unter Frame-Cursor aktivieren Generierung dieses Dokuments.
Visual Studio-Projekt für die Verwendung von HWASan oder ASan konfigurieren
HWASan oder ASan aktivieren
Um HWASan oder ASan zu aktivieren, gehen Sie zu Configuration Properties > „Allgemein“ im Abschnitt Property-Seiten für Ihr Projekt
Abbildung 1: Option Eigenschaften des Projekts in der Visual Studio-Lösung Explorer-Fenster.
Abbildung 2: Die Einstellung Address Sanitizer (ASan) im allgemeinen Projekt. Eigenschaften.
Ändern Sie Address Sanitizer (ASan), um HWASan für Ihr Projekt zu aktivieren. Einstellung auf Hardware ASan aktiviert (fsanitize=hwaddress)
Ändern Sie die Einstellung Address Sanitizer (ASan), um ASan für Ihr Projekt zu aktivieren. auf ASan Enabled (fsanitize=address).
Framepointer-Generierung aktivieren
Die Erstellung des Frame-Pointers wird vom Omit-Frame-Pointer C/C++ gesteuert, Compiler-Einstellung. Sie finden sie in Ihrem Projekt Property-Seiten unter Konfigurationseigenschaften > C/C++ > Optimierung:
Abbildung 3: Wo finde ich die Einstellung Frame-Zeiger entfernen?
Setzen Sie bei der Verwendung von HWASan oder ASan die Einstellung Omit Frame Pointer auf Nein (-fno-omit-frame-pointer).
C++-Standardbibliothek im Modus für gemeinsam genutzte Bibliothek verknüpfen
Die Einstellung für den Verknüpfungsmodus für die C++-Standardbibliothek finden Sie in der Property-Seiten des Projekts unter Konfigurationseigenschaften > „Allgemein“, in im Abschnitt Projektstandards.
Abbildung 4: Wo befindet sich die Einstellung des Verknüpfungsmodus für die C++-Standardbibliothek?
Bei der Verwendung von HWASan oder ASan Verwendung von STL zur Verwendung von C++-Standardbibliotheken (.so). Dieser Wert verknüpft die C++- Standardbibliothek als gemeinsam genutzte Bibliothek in Ihr Projekt ein. Diese ist für HWASan und ASan korrekt funktionieren.
Build-Konfiguration für die Verwendung von Address Sanitizer erstellen
Wenn Sie HWASan oder ASan vorübergehend verwenden möchten, sollten Sie eine neue Build-Konfiguration zu erstellen. Dies könnte der Fall sein, wenn Ihre Projekt klein ist, Sie die Funktion testen oder als Reaktion auf ein die Sie beim Testen entdecken können.
Wenn Sie sie jedoch nützlich finden und vorhaben, sie regelmäßig zu verwenden, können Sie Erstellen einer neuen Build-Konfiguration für HWASan oder ASan, wie in der Teapot-Probe. Das ist beispielsweise sinnvoll, führen Sie Address Sanitizer regelmäßig im Rahmen Ihrer Unittests oder während Rauchtests in Ihrem Spiel über Nacht.
Das Erstellen einer separaten Build-Konfiguration kann besonders nützlich sein, wenn Sie eine großes Projekt, das viele verschiedene Drittanbieterbibliotheken nutzt wo Sie sie normalerweise statisch mit der C++-Standardbibliothek verknüpfen. Dediziert Build-Konfigurationen können dabei helfen, dass Ihre Projekteinstellungen jederzeit korrekt sind.
Um eine Build-Konfiguration zu erstellen, klicken Sie auf den Property-Seiten Ihres Projekts auf
die
Konfigurationsmanager... und öffnen Sie dann das
Aktive Lösungskonfiguration. Wählen Sie dann