问题标签 [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 回答
2183 浏览

swift - 如何避免与 GCD DispatchWorkItem.notify 的数据竞争?

在 XCode 8.3 上使用 Swift 3.1,使用 Thread Sanitizer 运行以下代码会发现数据竞争(请参阅代码中的写入和读取注释):

这对我来说似乎很奇怪,因为DispatchWorkItem它允许提及的文档:

收到有关他们完成的通知

这意味着notify一旦工作项的执行完成,就会调用回调。

所以我希望's 的工作关闭和它的通知关闭之间会有happens-before关系。DispatchWorkItem将 aDispatchWorkItem与这样的注册notify回调一起使用不会触发 Thread Sanitizer 错误的正确方法是什么(如果有的话)?

我尝试注册notifywithitem.notify(flags: .barrier, queue: .main) ...但比赛仍然存在(可能是因为该标志仅适用于同一个队列,有关该标志的作用的文档很少.barrier)。但是,即使在与工作项的执行相同的(后台)队列上调用 notify ,也会flags: .barrier导致竞争。

如果你想试试这个,我在 github 上发布了完整的 XCode 项目:https ://github.com/mna/TestDispatchNotify

有一个TestDispatchNotify方案可以在没有 tsan 的情况下构建应用程序,并TestDispatchNotify+Tsan激活 Thread Sanitizer。

谢谢,马丁

0 投票
1 回答
259 浏览

ios - 线程清理程序导致应用程序不断冻结?

每当我启动应用程序并打开线程清理程序时,它就会冻结。当我暂停执行时,我总是看到某种 tsan 函数调用,主线程已经完全卡住了。我怎样才能防止这种情况?我正在使用 Xcode 8.3.2。

0 投票
1 回答
634 浏览

c++ - Clang ThreadSanitizer:解锁未锁定的互斥体,原子正在创建数据竞争

我正在使用 ThreadSanitizer 进行线程分析,我收到一个警告,这对我对互斥锁如何工作的理解非常非常困惑。我在 Debian Stretch 上使用 gcc 6.3。

在课堂上,在一个线程中,我有:

在另一个线程调用的另一个地方,我有:

ThreadSanitizer 警告我存在竞争条件,这很棒。所以我通过以下方式解决了这个问题:

另一个地方:

现在数据竞赛已经结束,ThreadSanitizer 说互斥锁被“两次”解锁......

它指向unlock()调用+另一个函数的结尾。

一个互斥锁怎么会被解锁两次?有人可以解释一下吗?

现在由于这让我很头疼,我决定改为这样做:

现在我收到了一个数据竞赛投诉:

那么我使用 ThreadSanitizer 错了吗?有人可以解释这里发生了什么吗?

0 投票
0 回答
576 浏览

c++ - 如何将 Julia 嵌入到使用 gcc 构建的 c++ cmake 应用程序中

我正在为 c++ cmake 可执行应用程序创建一个库。在这个库中,我希望能够调用 julia 函数,如本例所示。为此,我从此处下载了 Julia linux 二进制文件,其中包括可执行应用程序、共享对象文件和包含文件。然后我将 libjulia.so 链接到我的共享库,并包含 Julia 标头。

我已经使用如下所示的 CMake 完成了此操作:

我认为一个潜在的问题是我只链接了 libjulia.so 和 libLLVM-3.9.1.so,但实际上 Julia/lib 目录中还有更多。我只链接了这两个,因为我首先尝试在不链接任何内容的情况下进行编译,并且我对函数有未定义的引用,所以我添加了 libJulia.so,然后我对以路径 libLLVM\ 开头的函数有未定义的引用,所以我添加了 libLLVM-3.9.1 。所以。然后它运行,但失败,错误显示在这个问题的底部。另一个潜在的问题是我使用 gcc 编译,而不是 clang,所以我不知道 LLVM 库是否可以工作。

作为参考,这是我的 MakeTests 函数。它创建一个可执行文件并将我的静态库和 gtest 库链接到它。

然后我正在运行的可执行文件是 sampleTest.exe。这是由 sampleTest.cpp 制作的,如下所示:

我的应用程序输出如下:

为什么我会收到此错误?我应该如何设置我的 CMake,以便我可以运行 Julia 代码而不会出现这样的错误?

谢谢。

0 投票
1 回答
30 浏览

xcode - 由于缺少消毒剂,旧 macOS 中的 XPC 进程崩溃

当我在 Xcode 9.1 中构建我的 macOS 应用程序的 Debug Build 并将其移动到运行 macOS 10.11 或 10.12 的 Mac 上进行测试时,我发现我的应用程序的 XPC 进程在加载时崩溃,并且崩溃报告表明原因是系统在旧系统中找不到新的 sanitizer 框架。好的,我知道这些框架在旧 macOS 版本中不存在。而且,如果我在 Xcode中方案的Run > Diagnosics部分禁用 Address Sanitizer、Thread Sanitizer 和 Undefined Behavior Sanitizer ,然后重新构建,问题就解决了。

这里有些事情没有意义。为什么Xcode Scheme的Run部分明显影响Build?为什么只有XPC进程崩溃?

0 投票
1 回答
1448 浏览

gcc - gcc 的有效消毒剂抑制字符串是什么?

当使用带有 gcc 的消毒剂时,可以提供一个例外/抑制列表来处理误报等。

抑制文件格式的文档记录很差。

每个抑制的形式

的有效值是name_of_check什么?

0 投票
1 回答
130 浏览

c++ - 用于检测滥用 POSIX pthreads API 而非 Helgrind 的工具

出于某种原因,我不能使用 Helgrind 来检测 POSIX pthreads API 的滥用(例如,解锁非锁定互斥体、释放包含锁定互斥体的内存等)。我试图找到另一个工具,但实际上失败了。我发现,Dr. Memory 不能用于检测线程错误,而 Thread Sanitizer 只能检测数据竞争。真的是这样吗?你能推荐我一些其他的工具吗?

0 投票
0 回答
114 浏览

c++ - 通过引用在 lambda 中捕获本地对象是否会导致数据竞争?

我有一些代码在使用 Thread Sanitizer 运行时导致错误:

在里面RenderWatcher我有一个构造函数,它在私有字段中设置取消令牌:

还有一些吸气剂:

lambda[&renderWatcher]() { return !renderWatcher.isRenderInProgress(); }boost::async存储在私有字段中的实例,并询问“可以取消此渲染过程吗?”。

TSAN 竞赛在RenderWatcher构造函数中,在设置 cancelToken 时,并且在没有互斥锁的情况下renderWatcher.isRenderInProgress读取。cancellationToken

如果 RenderWatcher 是一个局部变量,但它是通过 lambda 中的引用捕获的,我可以进行数据竞争吗?

按价值捕获解决了竞争:

或使用互斥锁进行保护:

这是一场真正的数据竞赛吗?按引用或按值捕获有何不同?

谢谢。

0 投票
1 回答
903 浏览

c++ - Thread sanitizer 对“函数竞赛”给出了假阴性

考虑以下代码:

  1. 如果我用 编译此代码compilers/linux-x86_64-2.10.1/gnu7.1.0/bin/g++ -fsanitize=thread -O3 -std=c++11 main.cpp -o a.outTSan则不会提供任何警告和/或线程错误。
  2. 但是,允许此代码同时生成42 00 0作为输出。
    • 如果在开始g()之前执行f(),那么r1 = y.load()将有一个值42
    • 如果在开始g()之前没有执行f(),那么r1 = y.load()将有一个值0
  3. 这是我应该期待TSan的,还是我的期望在这里完全错误?
    • 如果我的期望是错误的,可以做些什么(除了代码检查,这对于更大的代码库来说可能非常困难)来发现这样的错误?
    • 如果应该抛出一些错误,是否有一些我可能缺少的特定选项(我正在使用此处文档中指定的所有默认值)?
0 投票
1 回答
43 浏览

c++ - ThreadSanitizer 只打印 2 帧

出于某种原因,我的日志中 ThreadSanitizer 生成的调用堆栈总是正好是两帧(#0、#1)。有没有限制帧数的隐藏设置?

问候