Swift多线程开发 - 10. Thread Sanitizer

Thread Sanitizer(TSan, 线程消毒剂🤔?), 是LLVM里Apple提供检测多线程开发中可能存在的资源竞争情况的工具。
不过它只能在模拟器上运行。

除了TSan之外,还有一些其他的Sanitizer,比如Address Sanitizer, Main Thread Chekcer。

Apple官方文档

例子

新建一个工程,在ViewController中加入代码

var counter = 0

override func viewDidLoad() {
    super.viewDidLoad()

    let queue = DispatchQueue(label: "example")
    queue.async {
        for _ in 1 ... 10000 {
            Thread.sleep(forTimeInterval: 0.1)
            self.counter += 1
        }
    }

    DispatchQueue.main.async {
        for _ in 1 ... 10000 {
            self.counter += 1
        }
    }
}

两个线程同时对counter变量访问,会产生竞争。下面我们运行Thread Sanitizer来检测一下

使用

在Edit Scheme中,勾选Thread Sanitizer
![设置(https://upload-images.jianshu.io/upload_images/1743573-ebc93e08a7579944.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
然后再次运行

Demo

👆出现了资源竞争告警

打开错误检视器(CMD+5), 选择 Runtime tab, 展开堆栈跟踪。
就像平时的崩溃报错调试一样,点击对应行可以在代码中定位

Issue Reveal

注意事项

Thread Sanitizer是运行时检查,这意味着如果代码可能会产生资源竞争但是在某次运行的时候没有发生,那Thread Sanitizer就不会告警了。
所以在发布前的测试要多跑几次,增加捕获问题代码的几率。



作者博客地址

系列文章链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 7,190评论 1 15
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 8,068评论 1 18
  • # 一、框架概述 # 课程概述 1. laravel 4天(之前TP框架还是很大的区别)(国外框架) 2. 在线教...
    关进一阅读 3,073评论 0 0
  • 乖乖的,俺又来了。上一个系列写传感器,特别庆幸自己在开篇的时候就立下了一个Flag,不然那个系列估计到现在就不知道...
    非典型技术宅阅读 10,585评论 15 39
  • 圣洁,正义,独立的女主刑警芮小丹爱上博学多才,气质儒雅的男主丁元英,两人都是非常理性,人格独立,遵守自然规律...
    随风潜入夜_689a阅读 2,405评论 0 1