Xcode 8 集成了 Thread Sanitizer,这是一种用于检测竞争条件和其他线程相关问题的工具。
我正在尝试针对我的一个项目运行它,并且正在检测第三方二进制库的许多问题。这些问题压倒了我自己的代码中的任何问题,并且在供应商修复之前我无法替换二进制库。
如何在 Xcode 中为第三方库抑制这些 Thread Sanitizer 警告?
最佳答案
Thread Sanitizer 可以使用抑制文件有选择地关闭它在代码之外的库中检测到的问题的报告。要在 Xcode 中使用这些,首先创建一个名为 TSan.supp
的文件。 ( 或类似的东西) 并将行放入其中,如下所示:
mutex:Purge
mutex:ProcessBulkInData
mutex:EventDestroy
我在特定库中的几个内部函数中遇到了错误互斥体的问题,因此我通过提供来自出现在 Thread Sanitizer 堆栈跟踪中的函数名称的子字符串来抑制互斥体警告(上面的 mutex:
部分)。完成抑制文件后,在 Xcode 中编辑您的运行方案并转到参数选项卡。在环境变量下,添加名称
TSAN_OPTIONS
并给它一个值 suppressions=[path_to_TSan.supp]
.该路径需要相对于派生数据位置中的应用程序二进制文件。您可能需要多次运行 Thread Sanitizer 并编辑您的抑制文件以添加您希望抑制的库中的每个项目。
此抑制文件的文件格式和其他选项可以在 this wiki page 上找到。 .为了后代,这些是
thread: suppresses reports related to threads (leaks)
mutex: suppresses reports related to mutexes (destruction of a locked mutex)
signal: suppresses reports related to signal handlers (handler calls malloc())
deadlock: suppresses lock inversion reports
called_from_lib: suppresses all interceptors in a particular library
感谢匿名 Apple 工程师,他在回应最近的错误报告时解释了这个过程。
关于xcode - 如何从外部库中抑制 Xcode 中的 Thread Sanitizer 警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38251409/