2016-07-07 111 views
10

Xcode 8集成了Thread Sanitizer,一种用于检测竞态条件和其他线程相关问题的工具。如何从外部库中抑制Xcode中的Thread Sanitizer警告?

我试图运行这个对我的一个项目,并检测到与第三方二进制库的许多问题。这些问题压倒了我自己代码中的任何问题,并且在供应商修复它之前,我无法替换二进制库。

如何在Xcode中为第三方库抑制这些Thread Sanitizer警告?

+0

这里我们有两种情况; 1)线程消毒器产生一堆无用的警告,在这种情况下应该扔掉工具;或2)警告是真实的,在这种情况下,还有两种情况2a)您可以放置​​适当的互斥体,因此应该这样做,或者2b)*在这种情况下,如果供应商不会修复它,则必须抛出库*。库中的竞争条件无法防范意味着库不适合多线程代码。 – Joshua

+0

不要忽略竞态条件或潜在的堆腐败问题,因为您无法替换库。这就是完全的疯狂。 – Joshua

回答

16

线程净化器可以使用抑制文件来选择性地关闭报告,检测它在代码之外的库中检测到的问题。要使用这些用Xcode中,首先创建一个名为TSan.supp(或类似的东西)文件,并把线到它类似如下:

mutex:Purge 
mutex:ProcessBulkInData 
mutex:EventDestroy 

我在某个特定库中遇到的几个内部功能不好的互斥问题,所以我通过在Thread Sanitizer堆栈跟踪中出现的函数名称提供一个子字符串来抑制互斥警告(上述mutex:部分)。

一旦你完成了压缩文件,在Xcode中编辑你的Run方案并转到Arguments选项卡。在环境变量下,添加名称TSAN_OPTIONS并赋予其值suppressions=[path_to_TSan.supp]。路径将需要相对于您的派生数据位置中的应用程序的二进制文件。

您可能需要多次运行Thread Sanitizer并编辑您的压缩文件以添加要压缩的库中的每个项目。

此抑制文件的文件格式和其他选项可在this wiki page上找到。为后代,这些是

螺纹:抑制(泄漏)

互斥有关线程报告:抑制有关互斥(锁定互斥的破坏)

信号报告:抑制与信号处理程序有关的报告(处理程序调用malloc())

死锁:抑制锁定反转报道

called_from_lib:抑制所有拦截器在一个特定的库

由于去匿名苹果工程师谁在回应最近的bug报告解释了这个过程。