问题标签 [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.
macos - 如何在 OSX 上使用 clang 线程清理程序?
我正在尝试--thread-sanitizer
在 OSX 上使用 clang 选项:
看起来像一个链接错误。我应该链接一些额外的库吗?
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位的,不支持!我对吗?
c++ - 使用 clang 的 ThreadSanitizer 和 TBB 避免误报
有没有人用Intel Threading Building Blocks (TBB)尝试过clang 的 ThreadSanitizer?
到目前为止,我的经验是,即使是相对简单的示例,您也会收到很多警告。不幸的是,其中许多似乎是误报。
在这个对另一个 ThreadSanitizer 问题的回答中,建议使用抑制文件。那能帮上忙吗?是否有 TBB 或任何其他技术的抑制文件?
(旁注:使用Helgrind,它看起来很相似。很多误报。)
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 次)
c++ - 来自 std::set insert() 和 find() 的写入数据竞争?
为了试验线程清理器,我创建了一个小型 C++ 程序,该程序有意包含数据竞争。确实,tsan 确实检测到了错误,太棒了!但是我对生成的消息感到困惑......
- 它报告了一个写-写数据竞争,我本来预计会出现一个读写竞争。我希望
find()
不要写在我的容器中。如果我进一步进行小的代码调整以尝试获取 的const
版本set::find()
,似乎仍然存在相同的写入竞争。 - 它显示了 4 字节原子写入和同一地址的 8 字节写入之间的写入冲突。容器类中的同一个字段被两种不同的访问类型访问,这似乎很奇怪。
是否可以选择使用find()
不写入 STL 容器的 const?
这是经过测试的 C++ 程序:
这是 tsan 输出的(部分):
感谢您的任何反馈,乔斯
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
最终版本时也会发生同样的情况。
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 产生误报,但实际上没有数据竞争。
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 采取了我认为正确的行为
非常感谢,
clang - ThreadSanitizer (tsan) - 抑制文件与黑名单文件
ThreadSanitizer抑制文件和黑名单文件有区别吗?-- 当被 -fsanitize-blacklist= 的 llvm 特定编译器标志使用时
我什么时候应该使用其中一种?
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 调用了我的很多代码,所以我认为我不能阻止包括库在内的任何堆栈。而且,当然,即使我可以使用偏移量制作抑制文件,如果我重新编译库,所有这些都可能改变。