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

Bra*_*son 12 xcode thread-sanitizer

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

我正在尝试针对我的项目运行此项,并且正在检测第三方二进制库的许多问题.这些问题在我自己的代码中是压倒性的,在供应商修复它之前我无法替换二进制库.

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

Bra*_*son 19

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

mutex:Purge
mutex:ProcessBulkInData
mutex:EventDestroy
Run Code Online (Sandbox Code Playgroud)

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

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

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

可以在此Wiki页面上找到此抑制文件的文件格式和其他选项.对于后代,这些是

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

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

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

死锁:抑制锁定反转报告

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

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