Thread Sanitizer può utilizzare i file di soppressione per disattivare selettivamente i report per i problemi rilevati nelle librerie esterne al codice. Per utilizzare questi con Xcode, prima creare un file denominato TSan.supp
(o qualcosa di simile) e mettere le linee in esso come il seguente:
mutex:Purge
mutex:ProcessBulkInData
mutex:EventDestroy
stavo incontrando problemi con cattive mutex in diverse funzioni interne all'interno di una particolare libreria, in modo Ho soppresso gli avvisi mutex (la parte mutex:
di quanto sopra) fornendo una sottostringa dai nomi delle funzioni che apparivano nella traccia dello stack di Thread Sanitizer.
Una volta terminato il file di soppressione, modificare lo schema Esegui in Xcode e andare alla scheda Argomenti. In Variabili d'ambiente, aggiungere il nome TSAN_OPTIONS
e assegnargli un valore di suppressions=[path_to_TSan.supp]
. Il percorso dovrà essere relativo al file binario dell'applicazione nel percorso dei dati derivati.
Potrebbe essere necessario eseguire Thread Sanitizer un paio di volte e modificare il file di soppressione per aggiungere ciascuno degli elementi dalla libreria che si desidera eliminare.
Il formato del file e altre opzioni di questo file di soppressione sono reperibili su this wiki page. Per posteri, questi sono
filo: sopprime rapporti relativi ai filetti (perdite)
mutex: sopprime rapporti sono collegati mutex (distruzione di un mutex bloccato)
segnale : sopprime i rapporti relativi ai gestori di segnale (gestore chiamate malloc())
deadlock: sopprime l'inversione di blocco segnala
called_from_lib: sopprime tutti gli intercettori in una particolare libreria
Ringraziamenti vanno al tecnico di Apple anonima che ha spiegato questo processo in risposta ad un recente rapporto di bug.
fonte
2016-07-07 17:07:00
Qui abbiamo due casi; 1) Thread Sanitizer genera pile di avvertimenti inutili, nel qual caso lo strumento deve essere gettato; o 2) gli avvertimenti sono reali, nel qual caso ci sono ancora due casi 2a) è possibile inserire i mutex appropriati e quindi dovrebbe farlo, o 2b) * nel qual caso la libreria deve essere lanciata se il venditore non la aggiusterà *. Le condizioni di gara in una libreria che non puoi evitare significa che la libreria non è adatta per il codice multithreading. – Joshua
Non ignorare le condizioni di competizione o potenziali problemi di danneggiamento dell'heap perché non è possibile sostituire la libreria. In questo modo giace tutta la follia. – Joshua