玩转 iOS 开发:iOS 10 新特性《Thread Sanitizer》

栏目: IOS · 发布时间: 6年前

内容简介:玩转 iOS 开发:iOS 10 新特性《Thread Sanitizer》

文章分享至我的个人技术博客: https://cainrun.github.io/14971830645415.html

Thread Sanitizer(TSan)

Thread Sanitizer 这个怎么翻译呢...其实我想了很久, 线程洗手液 ? 线程清扫车 ? 感觉都不太对....于是乎还是不翻译了, 我们只要知道这个东西是用来解决线程问题的就哦了, 我这个是 Objective-c 版本的, 如果你们喜欢 Swift 版本的话, 可以去找找 Swift版本

使用场景

那么在什么时候会用到这个 Thread Sanitizer 呢? 其实就是在我们精心开发好一个App之后, 发现有断断续续不停的小Bug, 然后会导致 Crash 等问题, 你又没法找到的时候, 就可以用这个东西试试看啦.

那一般会在什么情况下会发生呢? 我找到了一段比较官方的文字, 大家凑合着看看吧.

通常, 这些都是多个线程同时访问内存中的同一段地址造成的。相信线程问题是许多开发人员的噩梦。它们难以跟踪,因为错误只发生在某些条件下,所以确定问题的根本原因可能是非常棘手的。通常的原因是所谓的“race condition”。

当两个线程并发访问同一个变量,并且至少有一个访问是写时,会发生数据竞争。

Thread Sanitizer(TSan)可以检查的类型错误

虽然说 Thread Sanitizer 这个 工具 很牛逼, 但也不是万能的, 它只能够检测出以下几种错误.

  • Use of uninitialized mutexes
  • Thread leaks (missing phread_johin)
  • Unsafe calls in signal handlers (ex:malloc)
  • Unlock from wrong thread
  • Data race

打开Thread Sanitizer工具

Thread Sanitizer 工具是在工程里的 Edit Scheme -> Diagnostics 打开,

并不像 Instruments 那样在 Developer Tools 里打开.

玩转 iOS 开发:iOS 10 新特性《Thread Sanitizer》
1

创建项目

一切所有的东西, 都要从代码入手, 这里我们也是一样, 写一个小小的 Demo 来演示演示, UI 略丑, 大家凑合着看吧....代码的话, 在工程里自行去翻查吧~

玩转 iOS 开发:iOS 10 新特性《Thread Sanitizer》
2

里面的布局代码也没有什么好看的, 这里直接用的是 Masonry , 感谢 Masonry 作者的无私奉献~~

运算逻辑

这里我就不写那么大的数额了, 就取十位数哦了(别说我小气),

这里的存入逻辑灰常的简单, 计算完结果之后就传入进去:

- (void)setMoneyInTheBank {

    NSString *amount = [NSString stringWithFormat:@"总额: ¥%ld", self.bankView.amount + 10];

    [self.bankView changeLabelContentWithString:amount];
}

本来接着要去写取得逻辑, 但这里想到一个情况, 快速的按存和取, 那就会发生刚刚在文章开头所说的数据竞争问题, 这里经过思考后, 发现要使用一丢丢多线程的技巧.

- (void)getMoneyOfBanek {

    dispatch_async(dispatch_queue_create("com.threadsanitizer.ThreadSanitizer", nil), ^{

        if (self.amount <= 0) {
            NSLog(@"你都没钱啦, 怎么取?");

            return;
        }

        // 这是让线程先休息一秒先~
        sleep(1);

        dispatch_async(dispatch_get_main_queue(), ^{

            NSString *amount = [NSString stringWithFormat:@"总额: ¥%ld", self.amount -= 10];

            [self.bankView changeLabelContentWithString:amount];
        });
    });
}

写完之后, 然后运行, 狂点存和取, 然后就会出现下面酱紫的画面:

玩转 iOS 开发:iOS 10 新特性《Thread Sanitizer》
3

是不是很容易就找出问题的所在呢?

原理的话, 大概就和你吃饭一样, 先咽下第一口再咽下第二口, 不然一起咽下, 就会呛着了.

顺便说说:

  • TSan 是一个检查 Runtime Issues 的工具 (不支持静态检查)
  • 只能运行在语言版本3编写的Swift代码上 (Objective-C也可兼容),
  • 只能在64位macOS 或 64位模拟器上运行 (所有真机设备都不可以用来调试)。

工程地址

项目地址: https://github.com/CainRun/iOS-10-Characteristic/tree/master/2.Thread%20Sanitizer

最后

码字很费脑, 看官赏点饭钱可好
玩转 iOS 开发:iOS 10 新特性《Thread Sanitizer》
微信
玩转 iOS 开发:iOS 10 新特性《Thread Sanitizer》
支付宝

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

千夫所指

千夫所指

乔恩·罗森 / 王岑卉 / 九州出版社 / 2016-10-1 / CNY 42.80

编辑推荐: 《乌合之众》是为了跪舔权贵?《普通心理学》实验存在重大漏洞?《引爆点》的理论都是瞎掰的?社交网络时代《1984》预言的“老大哥”是否已经变成事实? 《纽约时报》年度十佳书 《GQ》杂志年度十佳书 《卫报》年度十佳书 《泰晤士报》年度十佳书 《经济学人》年度重推! 黑天鹅年度重点图书! 《乌合之众》是为了迎合权贵?《普通心理学》实验存在重大......一起来看看 《千夫所指》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具