Debug della corruzione della memoria mediante sanitizzatore indirizzi

Questo documento illustra come attivare speciali strumenti di debug quando utilizzi AGDE. Questi strumenti possono essere utili per i problemi di memoria difficili da diagnosticare o sovrascrivere errori di sovrascrittura.

Sanitizer e disinfettante per indirizzi HWAddress

HWAddress Sanitizer (HWASan) e Indirizzo Sanitizer (ASan) sono strumenti di debug che danneggiano la memoria è utile per eseguire il debug del danneggiamento della memoria e gli errori di sovrascrittura, come seguenti:

  • overflow e underflow del buffer dello stack
  • overflow e underflow del buffer dell'heap
  • Utilizzo dello stack al di fuori del proprio ambito
  • Errori double free e wild free
  • Utilizzo dello stack dopo il reso (solo HWASan)
di Gemini Advanced.

Ti consigliamo di attivare HWASan o ASan solo quando esegui il debug di un problema parte dei test automatici. Sebbene questi strumenti siano efficaci, il loro utilizzo incorrere in una sanzione.

Comportamento di runtime

Quando l'opzione è abilitata, sia HWASan che ASan controllano automaticamente la memoria danneggiata l'intero runtime dell'app.

Se viene rilevato un errore di memoria, l'app ha un arresto anomalo con un SIGBART (indicatore di interruzione) e stampa un messaggio dettagliato a logcat. Una copia del messaggio è anche in un file denominato /data/tombstones.

Il messaggio di errore è simile al seguente:

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)

Prerequisiti

Installa una build HWASan del sistema operativo Android

Per utilizzare HWASan, segui le istruzioni di configurazione nel Documentazione HWASan per installare una build HWASan del sistema operativo Android per Google Dispositivi Pixel.

Per altri dispositivi, contatta il produttore per ottenere una build HWASan del il sistema operativo, se disponibile, oppure utilizza lo strumento ASan solo software.

Usa la libreria standard C++ condivisa nel tuo progetto

A causa di un problema noto, ASan non è compatibile con la gestione delle eccezioni C++ quando utilizzando libc++_static. Questo problema non viene riscontrato quando si utilizza libc++_shared.

HWASan ha la propria implementazione degli operatori new e delete, che non possono da utilizzare se la libreria standard è collegata in modo statico al progetto.

Per modificare questa impostazione, consulta la sezione Collegamento della libreria standard C++ di questo documento.

Attiva la generazione di cursori frame

HWASan e ASan usano un unwinder veloce basato su puntatore frame per generare l'analisi dello stack per gli eventi di allocazione della memoria e deallocation. Ciò significa che devi abilitare la generazione del puntatore frame nelle impostazioni del compilatore C++ per utilizzare questi le funzionalità di machine learning. Ciò significa che devi disattivare l'ottimizzazione dell'omissione del puntatore frame.

Per modificare questa impostazione, consulta la sezione Attivazione del puntatore frame di generazione di testi di questo documento.

Configurazione del progetto Visual Studio per l'uso di HWASan o ASan

Attivazione di HWASan o ASan

Per abilitare HWASan o ASan, vai a Proprietà di configurazione > Generale in Pagine delle proprietà per il progetto.

Il menu delle proprietà di Esplora soluzioni di Visual Studio per la campagna attuale
progetto.

Figura 1: l'opzione Proprietà del progetto nella soluzione Visual Studio Finestra di esplorazione.

La finestra di dialogo Pagine della proprietà del progetto con Proprietà generali mostrate e Indirizzo
Impostazioni del disinfettante evidenziate.

Figura 2: l'impostazione Address Sanitizer (ASan) nel progetto generale proprietà.

Per abilitare HWASan per il tuo progetto, modifica il sanitizer degli indirizzi (ASan) su Hardware ASan abilitato (fsanitize=hwaddress).

Per attivare ASan per il tuo progetto, modifica l'impostazione sanitizer degli indirizzi (ASan) su ASan Enabled (fsanitize=address).

Abilitazione della generazione di cursori frame in corso...

La generazione del puntatore frame è controllata dall'opzione Ometti puntatore frame C/C++. dell'impostazione del compilatore e disponibile nelle pagine delle proprietà del progetto in Proprietà di configurazione > C/C++ > Ottimizzazione.

La finestra di dialogo Pagine delle proprietà del progetto con le proprietà di ottimizzazione C/C++ mostrate.
e Ometti le impostazioni del puntatore del frame
in evidenza.

Figura 3: dove trovare l'impostazione Ometti puntatore frame.

Quando utilizzi HWASan o ASan, configura l'impostazione Ometti puntatore frame su No (-fno-omit-frame-pointer).

Collegamento della libreria standard C++ in modalità Libreria condivisa

L'impostazione della modalità linker per la libreria standard C++ è disponibile nella Pagine proprietà del progetto in Proprietà di configurazione > Generale, in sezione Impostazioni predefinite del progetto.

La finestra di dialogo Pagine proprietà del progetto in cui è selezionata la categoria Generale e
Uso dell'impostazione STL
in evidenza.

Figura 4: dove trovare l'impostazione della modalità linker per la libreria standard C++.

Mentre utilizzi HWASan o ASan, imposta Utilizzo di STL per utilizzare le librerie standard C++ (.so). Questo valore collega il C++ libreria standard nel tuo progetto come libreria condivisa, richiesta per le HWASan e ASan per funzionare correttamente.

Creazione di una configurazione build per l'utilizzo di Address Sanitizer

Se preferisci utilizzare HWASan o ASan temporaneamente, potresti non voler creare una nuova configurazione di compilazione. Ciò potrebbe verificarsi se le tue progetto è piccolo, stai esplorando la funzionalità o in risposta a un problema durante il test.

Tuttavia, se lo ritieni utile e prevedi di usarlo regolarmente, puoi prendere in considerazione creando una nuova configurazione di build per HWASan o ASan, come mostrato Esempio di bollitore. Puoi farlo se, ad esempio, esegui regolarmente Address Sanitizer nell'ambito dei test delle unità o durante di fumo durante la notte.

Creare una configurazione di compilazione separata può essere particolarmente utile se hai una progetto di grandi dimensioni che utilizza un numero elevato di librerie di terze parti diverse in cui normalmente li colleghi in modo statico alla libreria standard C++. Dedicato configurazioni di build possono aiutare a garantire che le impostazioni del progetto rimangano sempre precisi.

Per creare una configurazione di compilazione, nelle Pagine delle proprietà del progetto fai clic su il Configuration Manager... (Gestione configurazione) e quindi apri il Menu a discesa Configurazione della soluzione attiva. Poi seleziona e crea una nuova configurazione di build con un nome appropriato (ad esempio, HWASan abilitata).