Speicherbeschädigung mit Address Sanitizer beheben

In diesem Dokument wird beschrieben, wie Sie bei der Verwendung von AGDE spezielle Debugging-Tools aktivieren. Diese Tools können bei schwer zu diagnostizierenden Speicherschäden und Überschreibungsfehlern helfen.

HWAddress Sanitizer und Address Sanitizer

HWAddress Sanitizer (HWASan) und Address Sanitizer (ASan) sind Tools zum Debuggen von Arbeitsspeicherschäden, die beim Debuggen von Arbeitsspeicherschäden und Überschreibungsfehlern helfen, z. B.:

  • Über- und Unterlauf von Stackpuffer
  • Über- und Unterflüsse des Heap-Puffers
  • Stacknutzung außerhalb des Geltungsbereichs
  • Double Free und Wild Free Fehler
  • Stack-Verwendung nach Rückgabe (nur HWASan)

Wir empfehlen, HWASan oder ASan nur dann zu aktivieren, wenn Sie ein Problem beheben möchten oder als Teil eines automatischen Tests. Diese Tools sind zwar leistungsstark, aber ihre Verwendung zieht Nachteile nach sich.

Laufzeitverhalten

Wenn diese Option aktiviert ist, suchen sowohl HWASan als auch ASan automatisch für die gesamte Laufzeit der App auf Speicherschäden.

Wenn ein Speicherfehler erkannt wird, stürzt die Anwendung mit dem Fehler SIGBART (Signalabbruch) ab 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

Installieren Sie einen HWASan-Build des Android-Betriebssystems

Wenn Sie HWASan verwenden möchten, folgen Sie der Einrichtungsanleitung in der HWASan-Dokumentation, um einen HWASan-Build des Android-Betriebssystems für Google Pixel-Geräte zu installieren.

Wenden Sie sich für andere Geräte an den Hersteller, um einen HWASan-Build des Betriebssystems zu erhalten, falls verfügbar, oder verwenden Sie das reine Software-ASan-Tool.

Freigegebene C++-Standardbibliothek in Ihrem Projekt verwenden

Aufgrund eines bekannten Problems ist ASan nicht mit der C++-Ausnahmebehandlung kompatibel, wenn libc++_static verwendet wird. Dieses Problem tritt bei der Verwendung von libc++_shared nicht auf.

HWASan hat eine eigene Implementierung der Operatoren new und delete, die nicht verwendet werden können, wenn die Standardbibliothek statisch mit dem Projekt verknüpft ist.

Informationen zum Ändern dieser Einstellung finden Sie im Abschnitt C++-Standardbibliothek verknüpfen in diesem Dokument.

Framezeiger-Generierung aktivieren

HWASan und ASan verwenden einen schnellen Frame-Pointer-basierten Entwickler, um Stacktrace-Informationen für Arbeitsspeicherzuweisung und -freigabeereignisse zu generieren. Das bedeutet, dass Sie die Frame-Pointer-Generierung in den C++-Compiler-Einstellungen aktivieren müssen, um diese Funktionen nutzen zu können. Das heißt, Sie müssen die Optimierung für die Auslassung von Framezeigern deaktivieren.

Informationen zum Ändern dieser Einstellung finden Sie im Abschnitt Generation von Framepointer aktivieren in diesem Dokument.

Visual Studio-Projekt für die Verwendung von HWASan oder ASan konfigurieren

HWASan oder ASan aktivieren

Um HWASan oder ASan zu aktivieren, wechseln Sie auf den Property-Seiten für Ihr Projekt zu Konfigurationseigenschaften > Allgemein.

Das Eigenschaftenmenü des Visual Studio-Projektmappen-Explorers für das aktuelle Projekt

Abbildung 1: Die Option Properties (Eigenschaften) des Projekts im Fenster des Visual Studio-Lösungs-Explorers.

Im Dialogfeld „Property-Seiten“ des Projekts sind die allgemeinen Eigenschaften zu sehen und die Address Sanitizer-Einstellungen sind markiert.

Abbildung 2: Die Einstellung Address Sanitizer (ASan) in den allgemeinen Projektattributen.

Um HWASan für Ihr Projekt zu aktivieren, ändern Sie die Einstellung Address Sanitizer (ASan) in Hardware ASan Enabled (fsanitize=hwaddress).

Um ASan für Ihr Projekt zu aktivieren, ändern Sie die Einstellung Address Sanitizer (ASan) in ASan Enabled (fsanitize=address).

Framepointer-Generierung aktivieren

Die Generierung von Framezeigern wird durch die C/C++-Compiler-Einstellung Omit Frame Pointer gesteuert und befindet sich auf den Property-Seiten Ihres Projekts unter Konfigurationseigenschaften > C/C++ > Optimierung.

Das Dialogfeld „Property-Seiten“ des Projekts. Die Eigenschaften für die C/C++-Optimierung sind zu sehen und die Einstellung „Frame-Zeiger weglassen“ ist markiert.

Abbildung 3: Wo Sie die Einstellung Frame Pointer weglassen finden

Setzen Sie bei Verwendung von HWASan oder ASan die Einstellung Omit Frame Pointer auf No (-fno-omit-frame-pointer).

C++-Standardbibliothek im Modus für gemeinsam genutzte Bibliothek verknüpfen

Die Einstellung des Verknüpfungsmodus für die C++-Standardbibliothek finden Sie auf den Property-Seiten Ihres Projekts unter Konfigurationseigenschaften > Allgemein im Bereich Projektstandards.

Im Dialogfeld „Property-Seiten“ des Projekts ist die Kategorie „Allgemein“ ausgewählt und die Einstellung „Use of STL“ (STL verwenden) ist markiert.

Abbildung 4: Wo finde ich die Einstellung für den Verknüpfungsmodus der C++-Standardbibliothek?

Setzen Sie bei Verwendung von HWASan oder ASan die Option Use of STL (Verwendung von STL) auf Use C++ Standard Libraries (.so) (C++-Standardbibliotheken verwenden). Dieser Wert verknüpft die C++-Standardbibliothek mit Ihrem Projekt als gemeinsam genutzte Bibliothek, die erforderlich ist, damit HWASan und ASan ordnungsgemäß funktionieren.

Build-Konfiguration für die Verwendung von Address Sanitizer erstellen

Wenn Sie HWASan oder ASan vorübergehend verwenden möchten, ist es eventuell nicht sinnvoll, eine neue Build-Konfiguration ausschließlich für diese zu erstellen. Dies kann der Fall sein, wenn Ihr Projekt klein ist, Sie die Funktion gerade erkunden oder auf ein Problem reagieren, das Sie beim Testen entdeckt haben.

Wenn Sie es jedoch nützlich finden und planen, es regelmäßig zu verwenden, können Sie eine neue Build-Konfiguration für HWASan oder ASan erstellen, wie im Teapot-Beispiel gezeigt. Dies kann zum Beispiel dann sinnvoll sein, wenn Sie Address Sanitizer regelmäßig im Rahmen Ihrer Einheitentests oder bei nächtlichen Rauchtests Ihres Spiels ausführen.

Das Erstellen einer separaten Build-Konfiguration kann besonders nützlich sein, wenn Sie ein großes Projekt haben, das eine große Anzahl verschiedener Drittanbieterbibliotheken nutzt, in denen Sie diese normalerweise statisch mit der C++-Standardbibliothek verknüpfen. Mit dedizierten Build-Konfigurationen können Sie dafür sorgen, dass Ihre Projekteinstellungen jederzeit korrekt sind.

Klicken Sie zum Erstellen einer Build-Konfiguration auf den Property-Seiten Ihres Projekts auf die Schaltfläche Konfigurationsmanager... und öffnen Sie dann das Drop-down-Menü Aktive Lösungskonfiguration. Wählen Sie dann aus und erstellen Sie eine neue Build-Konfiguration mit einem geeigneten Namen (z. B. HWASan aktiviert).