问题标签 [thread-sanitizer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1362 浏览

macos - 如何在 OSX 上使用 clang 线程清理程序?

我正在尝试--thread-sanitizer在 OSX 上使用 clang 选项:

看起来像一个链接错误。我应该链接一些额外的库吗?

0 投票
1 回答
18308 浏览

c - 如何使用 gcc v4.8.1 的 thread-sanitizer?

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

-fsanitize=线程

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

我在 Fedora 19 上的 gcc 版本:

将我的程序与以下命令(CMake 的输出)链接:

Gcc 说“找不到 -ltsan”。libtsan 存在于哪里?

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

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

-fsanitize=thread 仅支持 64 位 CPU。我的linuxuname -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位的,不支持!我对吗?

0 投票
1 回答
2522 浏览

c++ - 使用 clang 的 ThreadSanitizer 和 TBB 避免误报

有没有人用Intel Threading Building Blocks (TBB)尝试过clang 的 ThreadSanitizer

到目前为止,我的经验是,即使是相对简单的示例,您也会收到很多警告。不幸的是,其中许多似乎是误报。

这个对另一个 ThreadSanitizer 问题的回答中,建议使用抑制文件。那能帮上忙吗?是否有 TBB 或任何其他技术的抑制文件?

(旁注:使用Helgrind,它看起来很相似。很多误报。)

0 投票
1 回答
803 浏览

c++ - C++ shared_ptr 和threadsanitazer 报告数据竞争

这是来自threadsanitazer(clang)的粘贴,它报告数据竞争 http://pastebin.com/93Gw7uPi

谷歌搜索似乎这是threadsanitazer的问题(例如http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57507

所以让我们说这看起来像(刚才是手写的,所以它不是工作代码):

在主线程中创建新线程(实际上是在另一个类中)并为新的 io_service 处理程序运行

并从主线程元素定期添加或删除

因此,在这种情况下,根据文档判断(其中指出不同的 shared_ptr(boost 或 std)允许从多个线程进行读/写访问)是否存在数据竞争?

此代码是否为一个指针正确创建了两个不同的 shared_ptr 实例?

在 shared_ptr.h 中,我可以看到原子操作,所以我只想确认它是线程清理程序报告误报的问题。

在我的测试中,这可以正常工作,没有内存泄漏(shared_ptr 实例被正确删除并调用析构函数)、segfaults 或其他任何东西(10 小时插入/删除元素 - 每秒 100 次或每秒 1 次)

0 投票
1 回答
282 浏览

c++ - 来自 std::set insert() 和 find() 的写入数据竞争?

为了试验线程清理器,我创建了一个小型 C++ 程序,该程序有意包含数据竞争。确实,tsan 确实检测到了错误,太棒了!但是我对生成的消息感到困惑......

  1. 它报告了一个写-写数据竞争,我本来预计会出现一个读写竞争。我希望find()不要写在我的容器中。如果我进一步进行小的代码调整以尝试获取 的const版本set::find(),似乎仍然存在相同的写入竞争。
  2. 它显示了 4 字节原子写入和同一地址的 8 字节写入之间的写入冲突。容器类中的同一个字段被两种不同的访问类型访问,这似乎很奇怪。

是否可以选择使用find()不写入 STL 容器的 const?

这是经过测试的 C++ 程序:

这是 tsan 输出的(部分):

感谢您的任何反馈,乔斯

0 投票
2 回答
1646 浏览

c++ - 使用嵌入式引用计数器时,ThreadSanitizer 报告“操作员删除(void *)上的数据竞争”

请看下面的代码:

这有点类似于Boost.Atomic中的引用计数示例。

主要区别在于嵌入在构造函数中ref_count_被初始化1(一旦构造函数完成,我们就有一个对该ReferenceCounted对象的引用)并且代码不使用boost::intrusive_ptr.

请不要责怪我delete this在代码中使用 - 这是我在工作中的大型代码库中使用的模式,我现在无能为力。

clang 3.5现在,这段代码使用来自主干(详情如下)和ThreadSanitizer (tsan v2)编译,导致 ThreadSanitizer 的以下输出:

奇怪的是,它会将大小为 1 的写入写入与在引用计数器上执行原子减量时thread T1相同的内存位置。thread T2

前一种写法怎么解释?它是由类的析构函数执行的一些清理ReferenceCounted吗?

是误报吗?还是代码错了?

我的设置是:

代码编译如下:

请注意,在我的机器上,实现boost::atomic<T>解析为ThreadSanitizer 声称可以理解__atomic_load_n的函数系列。

更新 1:使用clang 3.4最终版本时也会发生同样的情况。

更新 2:同样的问题发生在libstdc++-std=c++11libc++中。<atomic>

0 投票
1 回答
1267 浏览

multithreading - GCC 4.9.1 ThreadSanitizer“好像通过睡眠同步”

我正在清理一个大型项目中的 ThreadSanitizer 警告。特别是在这种确切的情况下,有一个从文件生产者读取的衍生线程。然后有一个或多个解压线程作为线程池的一部分。最后,有一个线程实际上通过检索解压缩块来进行处理。这当然允许同时解压缩多个块。

项目通过原子 bool 和 同步的位置有很多usleep(),尤其包括这个。当然,这并不理想,这是分配给我的事情之一。

但只要表示互斥锁和锁,我看不出 ThreadSanitizer 会抱怨什么问题(除了与使用条件变量相比可能会降低效率)。

ThreadSanitizer 抱怨数据竞争“好像通过睡眠同步”,并提供了usleep()调用位置。我的问题是,当然通过睡眠进行同步并不理想,但只要尊重互斥锁,我就不会看到数据竞争。据我所知,互斥锁的工作方式,我相信它们受到尊重。

因此,我试图创建一组最小的复制步骤,以便准确识别 ThreadSanitizer 所抱怨的内容。

这是我想出的代码:

使用 GCC 4.9.1 编译的代码如第一条注释所示,我在执行结束时从 ThreadSanitizer 收到以下消息:

在所有线程都加入后,tsan 最终抱怨“好像通过睡眠同步”,这似乎是 lambda 的析构函数,特别是共享指针。由于这是 c++11 的一项功能,而且谷歌提供了大量证据表明 ThreadSanitizer 不太喜欢 C++11,我怀疑这本身并不是一场“真正的”比赛。

虽然......事实上,lambda 被用作线程的入口点......我想知道这是否是一个真正的竞赛,其中线程在 lamda 被销毁之前还没有完全退出?那将是编译器错误的领域,所以我不想进一步调查(范围蠕变等)。

所以我的问题(我知道它们有点开放,请帮我缩小范围?)

在这种情况下,为什么 ThreadSanitizer 不会在生产者、解压缩器和消费者中检测到“好像通过睡眠同步”的数据竞争?而且,是否有可能(并且您可以提供示例)将此代码修改为...

A) ...产生一个真正的数据竞争,它会发出一个不会“通常”导致崩溃的 ThreadSanitizer 警告(相关软件的当前生产版本似乎不会因为这种假定的数据竞争而崩溃)?

B) ...产生一个真正的数据竞赛,乍一看似乎不是数据竞赛,但知识和/或经验表明并非如此

C) ...从 ThreadSanitizer 产生误报,但实际上没有数据竞争。

0 投票
1 回答
1623 浏览

c++ - Gcc thread sanitizer false positive only for debug info flag

我在使用 Gcc 的线程清理程序时遇到问题,我无法在他们的 bugzilla 或 stackoverflow 上找到该问题,所以我不确定我是否遗漏了某些内容,或者这是否真的是一个错误。如果我创建一个包含以下内容的 main.cpp 文件:

现在,如果我使用以下方法编译它:

运行生成的可执行文件不会产生任何问题。但是,如果我添加调试信息标志:

然后线程清理程序检测到数据竞争:

现在用 clang++(版本 3.6.0(主干 221144))编译的完全相同的代码没有检测到数据竞争:

我对 gcc 的这种行为有点好奇,因为:1) 将一个空的 lambda 函数作为参数传递给线程对我来说似乎是合法的 2) gcc 的行为取决于 -g 标志,这并没有让我觉得有很多事情要做使用 thread sanitizer 3)在类似情况下 clang 采取了我认为正确的行为

非常感谢,

0 投票
1 回答
510 浏览

clang - ThreadSanitizer (tsan) - 抑制文件与黑名单文件

ThreadSanitizer抑制文件黑名单文件有区别吗?-- 当被 -fsanitize-blacklist= 的 llvm 特定编译器标志使用时

我什么时候应该使用其中一种?

0 投票
1 回答
1612 浏览

c++ - ThreadSanitizer (tsan) - 来自共享库的有意义的信息

我的应用程序使用 wxWidgets 库,通过 gcc 5.1.0 从源代码构建,使用 -g 和 -O0

我使用 clang++36 -g -fsanitize=thread -stdlib=libc++ 编译了我的应用程序,并使用 clang++36 -g -fsanitize=thread -stdlib=libc++ -lc++abi 链接它。它动态链接到 wxWidgets。

我收到的警告之一是:

我不高兴是因为: (1) 我想尝试在 wxWidgets 库中查找线程错误;(2) 我希望能够使抑制文件以或接近一个警告与抑制文件的比率运行。

因此,我通过 clang 3.6.0 从源代码重新编译/链接了 wxWidgets 库,添加了 -fsanitize=thread -stdlib=libc++ -lc++abi。交叉我的手指,它完成得很好。

在我的 wxWidgets gcc 构建目录中运行 sudo make uninstall ,并在我的 wxWidgets clang 构建目录中运行 sudo install 。

上面的警告现在显示:

我在运行程序的环境中定义了 TSAN_OPTIONS=second_deadlock_stack=1 ,并没有改变输出。

嗯,这是一些进步。我确定我会使用错误的术语,但这就像它缺少库的符号文件。

我已经检查它是否使用 clang & -fsanitize=thread (ldd 和时间戳) 动态链接到新库。

我已经检查过该库是否正在使用 -g 和 -O0 进行编译(即使它可能更高。)

如果重要的话,FreeBSD 10.1 64 位。Clang 是从源代码编译的。

问题 1 - 如何从共享库中获取“堆栈跟踪”以显示文件名和行号?

问题 2 - 如果我不能,我怎样才能制作一个好的抑制文件?问题是 wxWidgets 调用了我的很多代码,所以我认为我不能阻止包括库在内的任何堆栈。而且,当然,即使我可以使用偏移量制作抑制文件,如果我重新编译库,所有这些都可能改变。