2016-07-07 14 views
10

Xcode 8 incorpora il disinfettante per filettature, uno strumento per rilevare le condizioni della gara e altri problemi relativi al threading.Come posso eliminare gli avvisi di Thread Sanitizer in Xcode da una libreria esterna?

Sto provando a eseguire questo contro un mio progetto e sto rilevando molti problemi con una libreria di binari di terze parti. Questi problemi stanno travolgendo tutti quelli del mio codice e non posso sostituire la libreria binaria finché il fornitore non la risolve.

Come posso sopprimere questi avvisi Thread Sanitizer in Xcode per una libreria di terze parti?

+0

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

+0

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

risposta

16

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.

Problemi correlati