如何从外部库中禁止Xcode中的Thread Sanitizer警告?

时间:2016-07-07 17:07:01

标签: xcode thread-sanitizer

Xcode 8采用了Thread Sanitizer,这是一种用于检测竞争条件和其他线程相关问题的工具。

我试图针对我的项目运行此操作,并且正在检测第三方二进制库的许多问题。这些问题在我自己的代码中是压倒性的,我不能替换二进制库,直到供应商修复它。

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

1 个答案:

答案 0 :(得分:19)

Thread Sanitizer可以使用抑制文件有选择地关闭它在代码之外的库中检测到的问题的报告。要在Xcode中使用这些文件,首先要创建一个名为TSan.supp(或类似名称)的文件,然后将行放入其中,如下所示:

mutex:Purge
mutex:ProcessBulkInData
mutex:EventDestroy

我在特定库中的几个内部函数中遇到了错误的互斥锁问题,因此我通过提供Thread中出现的函数名称的子字符串来抑制互斥警告(上面的mutex:部分)消毒剂堆栈跟踪。

完成抑制文件后,在Xcode中编辑Run方案并转到Arguments选项卡。在“环境变量”下,添加名称TSAN_OPTIONS,并为其指定值suppressions=[path_to_TSan.supp]。该路径需要与派生数据位置中应用程序的二进制文件相关。

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

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

  

线程:禁止与线程(泄漏)相关的报告

     

互斥锁:禁止与互斥锁相关的报告(破坏锁定的互斥锁)

     

signal :禁止与信号处理程序相关的报告(处理程序调用malloc())

     

死锁:禁止锁定反转报告

     

called_from_lib :抑制特定库中的所有拦截器

感谢匿名的Apple工程师,他根据最近的错误报告解释了这个过程。