Xcode 8 包含 Thread Sanitizer,这是一种用于检测竞争条件和其他线程相关问题的工具。
我正在尝试针对我的一个项目运行它,并且正在检测第三方二进制库的许多问题。这些问题压倒了我自己的代码中的任何问题,并且在供应商修复之前我无法替换二进制库。
如何在 Xcode 中为第三方库抑制这些 Thread Sanitizer 警告?
Xcode 8 包含 Thread Sanitizer,这是一种用于检测竞争条件和其他线程相关问题的工具。
我正在尝试针对我的一个项目运行它,并且正在检测第三方二进制库的许多问题。这些问题压倒了我自己的代码中的任何问题,并且在供应商修复之前我无法替换二进制库。
如何在 Xcode 中为第三方库抑制这些 Thread Sanitizer 警告?
Thread Sanitizer 可以使用抑制文件选择性地关闭报告它在代码之外的库中检测到的问题。要在 Xcode 中使用这些,首先创建一个名为TSan.supp
(或类似的)的文件并将行放入其中,如下所示:
mutex:Purge
mutex:ProcessBulkInData
mutex:EventDestroy
我在特定库中的几个内部函数中遇到了错误互斥锁的问题,因此我mutex:
通过提供来自 Thread Sanitizer 堆栈跟踪中出现的函数名称的子字符串来抑制互斥锁警告(上述部分)。
完成抑制文件后,在 Xcode 中编辑 Run 方案并转到 Arguments 选项卡。在环境变量下,添加名称TSAN_OPTIONS
并为其赋值suppressions=[path_to_TSan.supp]
。该路径需要相对于派生数据位置中应用程序的二进制文件。
您可能需要运行几次 Thread Sanitizer 并编辑您的抑制文件以添加您希望抑制的库中的每个项目。
此禁止文件的文件格式和其他选项可以在此 wiki 页面上找到。为了后代,这些是
线程:抑制与线程相关的报告(泄漏)
mutex:抑制与互斥锁相关的报告(破坏锁定的互斥锁)
信号:抑制与信号处理程序相关的报告(处理程序调用 malloc())
deadlock:抑制锁反转报告
called_from_lib:抑制特定库中的所有拦截器
感谢匿名的 Apple 工程师,他在回应最近的错误报告时解释了这个过程。