2013-07-08 42 views
7

GCC v4.8.x添加選項調試程序:如何使用gcc v4.8.1的thread-sanitizer?

-fsanitize =線程

啓用ThreadSanitizer,快速數據競爭檢測器。內存訪問指令將用於檢測數據競爭錯誤。有關更多詳細信息,請參閱http://code.google.com/p/data-race-test/wiki/ThreadSanitizer。在Fedora 19

我的gcc版本:

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」。 libtsan在哪裏存在?

我發現http://gcc.gnu.org/gcc-4.8/changes.html東西:

ThreadSanitizer已添加,並且可以通過-fsanitize =線程啓用。指示將用於檢測數據競賽。 ThreadSanitizer在x86-64 GNU/Linux上可用。

-sanitize =線程僅支持64位CPU。我的Linux uname -a輸出爲:

的Linux hl.zy 3.9.8-300.fc19.i686#1 SMP週四6月27日19點40分39秒UTC 2013 i686的的i686 i386的GNU/Linux的

我的CPU是32位,不支持!我對嗎?

+0

由於它在鏈接命令行中沒有提及,但是被鏈接器抱怨,所以安裝在某些方面有缺陷的可能性很高。編譯器不應該接受'-fsanitize = thread'選項,或者應該在安裝GCC的其餘部分時安裝庫。你看過發行說明嗎?你檢查過編譯器配置('gcc -dumpspecs'等)嗎? –

+1

我不熟悉gcc,下面是「gcc -dumpspecs | grep tsan」的輸出:%{fsanitize = thread:%{static-libtsan:%{!shared:-Bstatic --whole-archive -ltsan - no-whole-archive -Bdynamic}}%{!static-libtsan:-ltsan}}}}%0 – husthl

+0

_「我是對嗎?」_是的。 –

回答

11

我做了一些探索:

  1. 我發現http://gcc.gnu.org/gcc-4.8/changes.html如下:

ThreadSanitizer已添加,並且可以通過-fsanitize =線程啓用。指示將用於檢測數據競賽。 ThreadSanitizer在x86-64 GNU/Linux上可用。

-sanitize =線程僅在64位CPU上受支持。我的Linux uname -a輸出:

的Linux hl.zy 3.9.8-300.fc19.i686#1 SMP星期四06月27日十九時40分39秒UTC 2013的i686的i686 i386的GNU/Linux的

我CPU是32位,不支持!

  • 我檢查編譯器配置,如喬納森萊弗勒所述
  • 下面

    是輸出 「GCC -dumpspecs | grep的TSAN」:

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

    但我不明白輸出。

  • 我有安裝Fedora 19的64位,則可以安裝libtsan

    sudo yum install libtsan.x86_64 
    
  • 腦震盪:

    -fsanitize =線程僅支持現在在64位gcc上。