Debug della corruzione della memoria mediante sanitizzatore indirizzi

Questo documento mostra come attivare gli strumenti di debug speciali quando si utilizza AGDE. Questi strumenti consentono di diagnosticare il danneggiamento della memoria e di sovrascrivere gli errori.

Sanitizer e sanitizzatore per indirizzi HWAddress

HWAddress Sanitizer (HWASan) e Address Sanitizer (ASan) sono strumenti di debug del danneggiamento della memoria che aiutano a eseguire il debug del danneggiamento della memoria e alla sovrascrittura degli errori, ad esempio di seguito:

  • Overflow e underflow del buffer dello stack
  • overflow e underflow del buffer heap
  • Utilizzo dello stack al di fuori dell'ambito di applicazione dello stack
  • Doppi errori senza costi e con caratteri jolly
  • Utilizzo dello stack dopo il reso (solo HWASan)

Ti consigliamo di attivare HWASan o ASan solo quando esegui il debug di un problema o nell'ambito dei test automatici. Questi strumenti offrono prestazioni elevate, ma il loro utilizzo comporta una sanzione.

Comportamento del runtime

Quando questa opzione è abilitata, sia HWASan sia ASan verificano automaticamente il danneggiamento della memoria per l'intero runtime della tua app.

Se viene rilevato un errore di memoria, l'app si arresta in modo anomalo con un errore SIGBART (interruzione del segnale) e stampa un messaggio dettagliato in logcat. Una copia del messaggio viene anche scritta in un file in /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 nella documentazione di HWASan per installare una build HWASan del sistema operativo Android per i dispositivi Google Pixel.

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

Utilizzare la libreria standard di C++ condivisa nel tuo progetto

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

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

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

Attiva la generazione del puntatore frame

HWASan e ASan utilizzano uno sviluppatore basato su puntatori a frame rapido per generare informazioni sull'analisi dello stack per gli eventi di allocazione della memoria e di deallocation. Ciò significa che per utilizzare queste caratteristiche devi abilitare la generazione del puntatore a frame nelle impostazioni del compilatore C++. Ciò significa che devi disattivare l'ottimizzazione dell'omissione del puntatore frame.

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

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

Attivazione di HWASan o ASan

Per abilitare HWASan o ASan, vai a Configuration Properties > General (Proprietà di configurazione > Generale) nelle Pagine delle proprietà per il tuo progetto.

Il menu delle proprietà di Esplora soluzioni di Visual Studio per il progetto corrente.

Figura 1: l'opzione Proprietà del progetto nella finestra di Esplora soluzioni di Visual Studio.

La finestra di dialogo Pagine delle proprietà del progetto con Proprietà generali visualizzate e Impostazioni di
Sanitizer per indirizzi evidenziate.

Figura 2: l'impostazione Address Sanitizer (ASan) nelle proprietà generali del progetto.

Per abilitare HWASan per il tuo progetto, modifica l'impostazione di Address Sanitizer (ASan) in Hardware ASan Enabled (fsanitize=hwaddress).

Per abilitare ASan per il tuo progetto, modifica l'impostazione Address Sanitizer (ASan) in ASan abilitata (fsanitize=address).

Attivazione della generazione del puntatore frame

La generazione del puntatore di frame è controllata dall'impostazione del compilatore C/C++ Omit Frame Pointer (Ometti puntatore frame) ed è disponibile nelle pagine delle proprietà del tuo progetto in Proprietà di configurazione > C/C++ > Ottimizzazione.

La finestra di dialogo Pagine delle proprietà del progetto in cui sono visualizzate le proprietà di ottimizzazione C/C++ e le impostazioni Ometti puntatore frame sono evidenziate.

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

Quando utilizzi HWASan o ASan, imposta l'impostazione Omit Frame Pointer (Ometti puntatore fotogramma) su No (-fno-omit-frame-pointer).

Collegamento della Raccolta standard di C++ in modalità Libreria condivisa

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

La finestra di dialogo Pagine delle proprietà del progetto con la Categoria Generale selezionata e l'impostazione Uso di STL evidenziata.

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

Quando utilizzi HWASan o ASan, imposta Uso di STL su Utilizza librerie standard di C++ (.so). Questo valore collega la libreria standard C++ al tuo progetto come libreria condivisa, necessaria per il corretto funzionamento di HWASan e ASan.

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

Se preferisci utilizzare HWASan o ASan temporaneamente, potresti non voler creare una nuova configurazione di build esclusivamente per il loro utilizzo. Questo può verificarsi se il progetto è di piccole dimensioni, se stai esplorando la funzionalità o in risposta a un problema rilevato durante il test.

Tuttavia, se la ritieni utile e prevedi di utilizzarla regolarmente, ti consigliamo di creare una nuova configurazione di build per HWASan o ASan come mostrato nell'esempio Teapot. Puoi farlo se, ad esempio, esegui regolarmente l'igienizzazione indirizzi durante i test delle unità o durante i test notturni del fumo del tuo gioco.

La creazione di una configurazione di build separata può essere particolarmente utile se hai un progetto di grandi dimensioni che utilizza un numero elevato di librerie di terze parti diverse in cui normalmente le colleghi in modo statico alla libreria standard C++. Le configurazioni di build dedicate possono contribuire a garantire che le impostazioni del progetto rimangano sempre precise.

Per creare una configurazione di compilazione, dalle pagine delle proprietà del progetto, fai clic sul pulsante Configuration Manager... e poi apri il menu a discesa Configurazione della soluzione attiva. Seleziona quindi e crea una nuova configurazione di build con un nome appropriato (ad esempio, HWASan abilitato).