如何使用gcc v4.8.1的线程清理程序? [英] How to use thread-sanitizer of gcc v4.8.1?

查看:245
本文介绍了如何使用gcc v4.8.1的线程清理程序?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

gcc v4.8.x add options for debugging your program:

-fsanitize = thread

-fsanitize=thread

启用ThreadSanitizer,一种快速的数据竞争检测器.内存访问指令将用于检测数据争用错误.请参见 http://code.google.com/p/data-race- test/wiki/ThreadSanitizer 了解更多详细信息.

Enable ThreadSanitizer, a fast data race detector. Memory access instructions will be instrumented to detect data race bugs. See http://code.google.com/p/data-race-test/wiki/ThreadSanitizer for more details.

我在Fedora 19上的gcc版本:

My gcc version on Fedora 19:

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

用下面的命令(CMake的输出)链接我的程序:

Link my program with below command (output of 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在哪里存在?

Gcc says "cannot find -ltsan". Where is libtsan exist?

我在 http://gcc.gnu.org/gcc-4.8/上找到了一些东西changes.html :

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

ThreadSanitizer has been added and can be enabled via -fsanitize=thread. Instructions will be instrumented to detect data races. The ThreadSanitizer is available on x86-64 GNU/Linux.

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

-fsanitize=thread is only support on 64bit CPU. My linux uname -a output is:

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

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位,不支持!我说的对吗?

My cpu is 32bit, It's not support! Am I right?

推荐答案

我做了一些探索:

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

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

ThreadSanitizer has been added and can be enabled via -fsanitize=thread. Instructions will be instrumented to detect data races. The ThreadSanitizer is available on x86-64 GNU/Linux.

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

-fsanitize=thread is only supported on 64 bit CPU. My linux uname -a outputs:

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

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位,不支持!

My CPU is 32 bit, It's not supported!

  1. 正如乔纳森·莱夫勒(Jonathan Leffler)所说,我检查了编译器的配置

以下是"gcc -dumpspecs | grep tsan"的输出:

below is output of "gcc -dumpspecs | grep tsan":

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

但是我不明白输出结果.

But I don't understand the output.

  1. 我已经安装了Fedora 19 64位,您可以安装libtsan:

sudo yum install libtsan.x86_64

脑震荡:

-fsanitize = thread现在仅在64位gcc上受支持.

-fsanitize=thread is only supported on 64 bit gcc now.

这篇关于如何使用gcc v4.8.1的线程清理程序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆