2013-07-08 1 views
7

gcc v4.8.x ajouter des options pour le débogage de votre programme:Comment utiliser le thread-sanitizer de gcc v4.8.1?

-fsanitize = fil

Activer ThreadSanitizer, un détecteur de course de données rapide. Les instructions d'accès à la mémoire seront instrumentées pour détecter les bogues de course de données. Voir http://code.google.com/p/data-race-test/wiki/ThreadSanitizer pour plus de détails.

Ma version gcc sur Fedora 19:

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

Lien avec mon programme ci-dessous commande (sortie de 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 dit "ne peut pas trouver -ltsan". Où est le libtsan?

J'ai trouvé quelque chose sur http://gcc.gnu.org/gcc-4.8/changes.html:

ThreadSanitizer a été ajouté et peut être activé via -fsanitize = fil. Les instructions seront instrumentées pour détecter les courses de données. Le ThreadSanitizer est disponible sur x86-64 GNU/Linux.

-fsanitize = le thread ne prend en charge que le processeur 64 bits. Mon linux uname -a sortie est:

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

Mon processeur est 32bit, ce n'est pas un support! Ai-je raison?

+0

Comme il n'est pas mentionné dans la ligne de commande de lien mais que l'éditeur de liens s'en plaint, les chances sont grandes que votre installation soit en quelque sorte défectueuse. Soit le compilateur n'accepte pas l'option '-fsanitize = thread', soit la librairie devrait être installée quand le reste de GCC a été installé. Avez-vous regardé les notes de mise à jour? Avez-vous vérifié la configuration du compilateur ('gcc -dumpspecs', etc)? –

+1

Je ne suis pas familier avec gcc, ci-dessous est la sortie de "gcc -dumpspecs | grep tsan":% {fsanitize = fil:% {statique-libtsan:% {! Partagé: -Bstatique --whole-archive -ltsan - no-whole-archive -Bdynamic}}% {! static-libtsan: -ltsan}}}}% o – husthl

+0

_ "Ai-je raison?" _ Oui. –

Répondre

11

J'ai fait quelques exploration:

  1. J'ai trouvé ce qui suit sur http://gcc.gnu.org/gcc-4.8/changes.html:

ThreadSanitizer a été ajouté et peut être activé via -fsanitize = fil. Les instructions seront instrumentées pour détecter les courses de données. Le ThreadSanitizer est disponible sur x86-64 GNU/Linux.

-fsanitize = le thread est uniquement pris en charge sur le processeur 64 bits. Mes sorties linux uname -a:

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

Mon Le processeur est de 32 bits, ce n'est pas supporté!

  1. J'ai vérifié la configuration du compilateur, comme Jonathan Leffler a dit

ci-dessous est sortie de "gcc -dumpspecs | grep tsan":

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

Mais Je ne comprends pas la sortie.

  1. J'ai installer Fedora 19 64 bits, vous pouvez installer libtsan:

    sudo yum install libtsan.x86_64 
    

Concusion:

-fsanitize = fil est pris en charge uniquement sur 64 bits gcc maintenant.

Questions connexes