2013-07-08 10 views
7

gcc v4.8.x aggiungere opzioni per il debug del programma:Come usare thread-sanitizer di gcc v4.8.1?

-fsanitize = filo

Abilita ThreadSanitizer, un rilevatore di corsa veloce dei dati. Le istruzioni di accesso alla memoria saranno strumentate per rilevare i bug della corsa dei dati. Vedi http://code.google.com/p/data-race-test/wiki/ThreadSanitizer per maggiori dettagli.

La mia versione di gcc su Fedora 19:

gcc version 4.8.1 20130603 (Red Hat 4.8.1-1) (GCC) 

collegare il mio programma con al di sotto di comando (output del CMake):

Linking C executable bin/ftu 
/usr/bin/cmake -E cmake_link_script CMakeFiles/ftu.dir/link.txt --verbose=1 
/usr/bin/cc -g -g -O0 -Wall -D_REENTRANT -rdynamic -fsanitize=thread -fPIE -pie CMakeFiles/ftu.dir/src/main/main.c.o -o bin/ftu -L/home/hl/ftu/arm/src/libapp/pc -rdynamic ../libapp/pc/libbase.a ../libapp/pc/libstbl.a ../libapp/pc/libstbl_utest.a ../libapp/pc/libbase_utest.a ../libapp/pc/libmem_utest.a ../libapp/pc/libmemspy_utest.a ../libapp/pc/libos_utest.a ../libapp/pc/libmain_utest.a ../libapp/pc/liblog_utest.a ../libapp/pc/libini_utest.a ../libapp/pc/libdsp_utest.a ../libapp/pc/libmstation_utest.a ../libapp/pc/libflist_utest.a ../libapp/pc/libdc_utest.a ../libapp/pc/libflist.a ../libapp/pc/libdsp.a ../libapp/pc/liblog.a ../libapp/pc/libini.a ../libapp/pc/libmstation.a ../libapp/pc/libdc.a ../libapp/pc/libmemspy.a ../libapp/pc/libmem.a ../libapp/pc/libos.a ../libapp/pc/libbase.a -lrt -lpopt -lpthread -Wl,-rpath,/home/hl/ftu/arm/src/libapp/pc 

/usr/bin/ld: cannot find -ltsan 

collect2: error: ld returned 1 exit status 

Gcc dice "non può trovare -ltsan". Dov'è il libtsan?

ho trovato qualcosa sulla http://gcc.gnu.org/gcc-4.8/changes.html:

ThreadSanitizer è stato aggiunto e può essere attivata tramite -fsanitize = thread. Le istruzioni saranno strumentate per rilevare le corse di dati. ThreadSanitizer è disponibile su x86-64 GNU/Linux.

-fsanitize = thread è supportato solo su CPU a 64 bit. La mia uscita linux uname -a è:

Linux hl.zy 3.9.8-300.fc19.i686 # 1 SMP gio 27 giu 19:40:39 UTC 2013 i686 i686 i386 GNU/Linux

La mia CPU è a 32 bit, non è supportato! Ho ragione?

+0

Poiché non è menzionato nella riga di comando del collegamento ma viene lamentato dal linker, è probabile che l'installazione sia in qualche modo difettosa. O il compilatore non dovrebbe accettare l'opzione '-fsanitize = thread' o la libreria dovrebbe essere stata installata quando è stato installato il resto di GCC. Hai guardato le note di rilascio? Hai controllato la configurazione del compilatore ('gcc -dumpspecs', ecc.)? –

+1

Non ho familiarità con gcc, di seguito viene visualizzato "gcc -dumpspecs | grep tsan":% {fsanitize = thread:% {static-libtsan:% {! Shared: -Bstatic --whole-archive -ltsan - no-whole-archive -Bdynamic}}% {! static-libtsan: -ltsan}}}}% o – husthl

+0

_ "Ho ragione?" _ Sì. –

risposta

11

ho fatto qualche esplorazione:

  1. ho trovato quanto segue su http://gcc.gnu.org/gcc-4.8/changes.html:

ThreadSanitizer è stato aggiunto e può essere attivata tramite -fsanitize = thread. Le istruzioni saranno strumentate per rilevare le corse di dati. ThreadSanitizer è disponibile su x86-64 GNU/Linux.

-fsanitize = thread è supportato solo su CPU a 64 bit. I miei linux uname -a uscite:

Linux hl.zy 3.9.8-300.fc19.i686 # 1 SMP gio 27 giu 19:40:39 UTC 2013 i686 i686 i386 GNU/Linux

mio La CPU è a 32 bit, non è supportata!

  1. ho controllato la configurazione del compilatore, come ha detto Jonathan Leffler

sotto è l'uscita di "-dumpspecs gcc | grep Tsan":

%{fsanitize=thread:%{static-libtsan:%{!shared:-Bstatic --whole-archive \ 
    -ltsan --no-whole-archive -Bdynamic}}%{!static-libtsan:-ltsan}}}} %o 

Ma Non capisco l'output.

  1. devo installare Fedora 19 64 bit, è possibile installare libtsan:

    sudo yum install libtsan.x86_64 
    

Concusion:

-fsanitize = filo è supportato solo su 64 bit gcc ora.