Thread Sanitizer的原理和使用 / 2019-08-31

Thread Sanitizer是基于LLVM的适用于Swift和C语言的检测数据竞争的工具。

Thread Sanitizer是基于LLVM的适用于Swift和C语言的检测数据竞争的工具。当多个线程在非同步的情况下访问同一内存且至少有一个是写操作时,就会发生数据竞争。数据竞争是非常危险的,可能导致程序的行为无法预测,甚至导致内存损坏。Thread Sanitizer还可以检测其他类型线程错误,包括未初始化的互斥锁和线程泄漏。

Thread Sanitizer的原理

Thread Sanitizer会记录每一个内存访问的信息,并检测该访问是否参与了竞争。代码中所有的内存访问都会被编译器转换为如下形式:

// Before
*address = ...;  // or: ... = *address;
// After
RecordAndCheckWrite(address);
*address = ...;  // or: ... = *address;

对性能的影响

开启Thread Sanitizer,将使代码执行效率降低2-20倍,内存使用增加5-10倍。可以通过设置-O1优化级别来提高内存利用率。

如何开启Thread Sanitizer?

Xcode中操作:

开启Thread Sanitizer

你也可以通过命令行的方式启用Thread Sanitizer。

  • clang

-fsanitize=thread

  • swiftc

-sanitize=thread

  • xcodebuild

-enableThreadSanitizer YES

Thread Sanitizer能干什么?

  • 数据多线程访问;
  • 访问未初始化的锁;
  • 线程使用完未释放。

其它文章

thread_sanitizer
Address Sanitizer的原理和使用
iOS 13中dyld 3的改进和优化
iOS NSURLProtocol详解及使用陷阱
CocoaPods Podfile and podspec configurations