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

文章最后修改于 2023-08-01

相关文章:

iOS文件系统目录结构
WWDC19:2019苹果全球开发者大会
iOS安全:Mach-O Type
iOS系统如何获取用户的本机手机号
NSUserDefaults的suitename

发表留言

您的电子邮箱地址不会被公开,必填项已用*标注。发布的留言可能不会立即公开展示,请耐心等待审核通过。