Speicherbeschädigung mit Address Sanitizer beheben

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

Das Eigenschaftenmenü des Visual Studio-Projektmappen-Explorers für die aktuelle
Projekt arbeiten.

Abbildung 1: Option Eigenschaften des Projekts in der Visual Studio-Lösung Explorer-Fenster.

Das Dialogfeld „Property-Seiten“ des Projekts mit angezeigten allgemeinen Eigenschaften und der Adresse
Desinfektionsmittel-Einstellungen hervorgehoben.

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:

Das Dialogfeld „Property-Seiten“ des Projekts mit den Attributen zur C/C++-Optimierung.
und Framezeiger-Einstellungen weglassen
hervorgehoben.

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.

Das Dialogfeld „Property-Seiten“ des Projekts mit der ausgewählten Kategorie „Allgemein“ und dem
Verwendung der Einstellung „STL“
hervorgehoben.

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 und dann Erstellen Sie eine neue Build-Konfiguration mit einem geeigneten Namen (z. B. HWASan). aktiviert).