【问题标题】:How to use thread-sanitizer of gcc v4.8.1?如何使用 gcc v4.8.1 的 thread-sanitizer?
【发布时间】:2013-07-08 00:45:35
【问题描述】:

gcc v4.8.x 添加调试程序的选项:

-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=thread 启用。将检测指令以检测数据竞争。 ThreadSanitizer 在 x86-64 GNU/Linux 上可用。

-fsanitize=thread 仅支持 64 位 CPU。我的 linux uname -a 输出是:

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

我的cpu是32位的,不支持!我说的对吗?

【问题讨论】:

  • 由于链接命令行中没有提及但链接器抱怨它,因此您的安装在某种程度上存在缺陷的可能性很高。编译器不应该接受-fsanitize=thread 选项,或者在安装GCC 的其余部分时应该已经安装了库。你看过发行说明吗?你检查过编译器配置(gcc -dumpspecs 等)吗?
  • 我对gcc不熟悉,下面是“gcc -dumpspecs | grep tsan”的输出:%{fsanitize=thread:%{static-libtsan:%{!shared:-Bstatic --整体存档 -ltsan --no-whole-archive -Bdynamic}}%{!static-libtsan:-ltsan}}}} %o
  • @JonathanLeffler,你假设有人会在不支持 tsan 时实施检查以很好地失败......我不确定这是真的 :)

标签: c gcc pthreads thread-sanitizer


【解决方案1】:

我做了一些探索:

  1. 我在http://gcc.gnu.org/gcc-4.8/changes.html 上找到了以下内容:

已添加 ThreadSanitizer,可通过 -fsanitize=thread 启用。将检测指令以检测数据竞争。 ThreadSanitizer 在 x86-64 GNU/Linux 上可用。

-fsanitize=thread 仅在 64 位 CPU 上受支持。我的 linux uname -a 输出:

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

我的 CPU 是 32 位的,不支持!

  1. 正如 Jonathan Leffler 所说,我检查了编译器配置

下面是“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。

【讨论】:

  • 澄清一下,你们听起来好像需要 x86_64 CPU,而不是 ARM。你真的是说 tsan 只适用于 64 位版本?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 2015-09-17
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
  • 2016-01-05
  • 2012-11-06
相关资源
最近更新 更多