2013-07-08 11 views
7

gcc v4.8.x für Debuggen von Programmoptionen hinzu:Wie Thread-Sanitizer von gcc v4.8.1 zu verwenden?

-fsanitize = Gewinde

ThreadSanitizer aktivieren, einen schnellen Daten Rennen Detektor. Speicherzugriffsbefehle werden instrumentiert, um Data-Race-Fehler zu erkennen. Weitere Informationen finden Sie unter http://code.google.com/p/data-race-test/wiki/ThreadSanitizer.

Meine gcc-Version auf Fedora 19:

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

mit meinem Programm Link unten Befehl (Ausgabe von 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 sagt "nicht -ltsan finden können". Wo gibt es Libsan?

fand ich etwas auf http://gcc.gnu.org/gcc-4.8/changes.html:

ThreadSanitizer wurde hinzugefügt und kann über -fsanitize = Thread aktiviert werden. Anweisungen werden instrumentiert, um Datenrennen zu erkennen. Der ThreadSanitizer ist auf x86-64 GNU/Linux verfügbar.

-fsanitize = Thread wird nur auf 64-Bit-CPU unterstützt. Mein Linux uname -a Ausgabe lautet:

Linux hl.zy 3.9.8-300.fc19.i686 # 1 SMP Do 27. Juni 19.40.39 UTC 2013 i686 i686 i386 GNU/Linux

Meine CPU ist 32bit, es ist keine Unterstützung! Habe ich recht?

+0

Da es in der Link-Befehlszeile nicht erwähnt wird, aber vom Linker beschwert wird, ist die Wahrscheinlichkeit hoch, dass Ihre Installation in irgendeiner Weise fehlerhaft ist. Entweder der Compiler sollte die Option "-fsanitize = thread" nicht akzeptieren oder die Bibliothek sollte installiert sein, wenn der Rest von GCC installiert wurde. Hast du dir die Release Notes angesehen? Haben Sie die Compilerkonfiguration überprüft ('gcc -dumpspecs', etc)? –

+1

Ich bin nicht vertraut mit gcc, unten ist die Ausgabe von "gcc -dumpspecs | grep tsan":% {fsanitize = thread:% {statisch-libtsan:% {! Shared: -Bstatic --whole-archive -ltsan - no-whole-archive -Bdynamic}}% {! statisch-libtsan: -ltsan}}}}% o – husthl

+0

_ "Bin ich richtig?" _ Ja. –

Antwort

11

Ich habe einige Exploration:

  1. ich folgendes auf http://gcc.gnu.org/gcc-4.8/changes.html gefunden:

ThreadSanitizer wurde hinzugefügt und kann über -fsanitize = Thread aktiviert werden. Anweisungen werden instrumentiert, um Datenrennen zu erkennen. Der ThreadSanitizer ist auf x86-64 GNU/Linux verfügbar.

-fsanitize = Thread wird nur auf 64-Bit-CPU unterstützt. Mein Linux uname -a Ausgänge:

Linux hl.zy 3.9.8-300.fc19.i686 # 1 SMP Do 27. Juni 19.40.39 UTC 2013 i686 i686 i386 GNU/Linux

Meine CPU ist 32 Bit, es wird nicht unterstützt!

  1. ich die Compiler-Konfiguration überprüft, wie Jonathan Leffler sagte

unten Ausgang ist "gcc -dumpspecs | grep tsan":

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

Aber Ich verstehe die Ausgabe nicht.

  1. Ich habe Fedora 19 64 Bit installieren, libtsan installieren:

    sudo yum install libtsan.x86_64 
    

Concusion:

-fsanitize = Thread wird nur unterstützt, auf 64 bit gcc jetzt.