Как использовать дезинфицирующее средство для потоков в gcc v4.8.1?

gcc v4.8.x добавить параметры для отладки вашей программы:

-fsanitize=поток

Включите ThreadSanitizer, быстрый детектор гонки данных. Инструкции по доступу к памяти будут приспособлены для обнаружения ошибок гонки данных. См. http://code.google.com/p/data-race-test/wiki/ThreadSanitizer для более подробной информации.

Моя версия gcc для Fedora 19:

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

Свяжите мою программу с командой ниже (вывод 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 говорит, что не может найти -ltsan. Где существует либцан?

Я нашел кое-что на http://gcc.gnu.org/gcc-4.8/changes.html :

Добавлен ThreadSanitizer, который можно включить с помощью -fsanitize=thread. Инструкции будут приспособлены для обнаружения гонок данных. ThreadSanitizer доступен для x86-64 GNU/Linux.

-fsanitize=thread поддерживается только на 64-битном процессоре. Мой вывод linux uname -a:

Linux hl.zy 3.9.8-300.fc19.i686 #1 SMP Чт, 27 июня, 19:40:39 UTC 2013 i686 i686 i386 GNU/Linux

Мой процессор 32-битный, он не поддерживается! Я прав?


person husthl    schedule 08.07.2013    source источник
comment
Поскольку он не упоминается в командной строке ссылки, но на него жалуется компоновщик, высока вероятность того, что ваша установка каким-то образом повреждена. Либо компилятор не должен принимать параметр -fsanitize=thread, либо библиотека должна быть установлена ​​вместе с остальной частью GCC. Вы смотрели примечания к выпуску? Вы проверили конфигурацию компилятора (gcc -dumpspecs и т. д.)?   -  person Jonathan Leffler    schedule 08.07.2013
comment
Я не знаком с gcc, ниже вывод gcc -dumpspecs | grep tsan: %{fsanitize=thread:%{static-libtsan:%{!shared:-Bstatic --whole-archive -ltsan --no-whole-archive -Bdynamic}}%{!static-libtsan:-ltsan} }}} %о   -  person husthl    schedule 08.07.2013
comment
@JonathanLeffler, вы предполагаете, что кто-то внедрил проверку, чтобы она нормально терпела неудачу, когда tsan не поддерживается ... Я не уверен, что это правда :)   -  person Jonathan Wakely    schedule 08.07.2013


Ответы (1)


Я провел небольшое исследование:

  1. Я нашел следующее на http://gcc.gnu.org/gcc-4.8/changes. HTML:

Добавлен ThreadSanitizer, который можно включить с помощью -fsanitize=thread. Инструкции будут приспособлены для обнаружения гонок данных. ThreadSanitizer доступен для x86-64 GNU/Linux.

-fsanitize=thread поддерживается только на 64-битном процессоре. Мой Linux uname -a выводит:

Linux hl.zy 3.9.8-300.fc19.i686 #1 SMP Чт, 27 июня, 19:40:39 UTC 2013 i686 i686 i386 GNU/Linux

Мой процессор 32-битный, он не поддерживается!

  1. Я проверил конфигурацию компилятора, как сказал Джонатан Леффлер

ниже вывод «gcc -dumpspecs | grep tsan»:

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

Но я не понимаю вывод.

  1. Я установил Fedora 19 64 бит, вы можете установить libtsan:

    sudo yum install libtsan.x86_64
    

Сотрясение мозга:

-fsanitize=thread теперь поддерживается только на 64-битном gcc.

person husthl    schedule 09.07.2013
comment
Просто чтобы уточнить, вы, ребята, говорите, что вам нужен процессор x86_64, а не ARM, например. Вы действительно имеете в виду, что tsan будет работать только для 64-битных сборок? - person JoeManiaci; 14.05.2020