一. Thread Santizer(TSAN) 線程競態(tài)檢測工具:可以在運行時發(fā)現(xiàn)線程競態(tài)
競態(tài)
兩個線程同時訪問同一個變量卫枝,而且其中至少一個線程要做的是寫操作,這種情況就叫競態(tài)慨丐。
使用場景
開發(fā)的App中存在的不能穩(wěn)定重現(xiàn)的bug诫肠。
原因
這種bug通常是由多個線程訪問同一塊內存造成的。(俗稱:線程沖突問題)
Demo
https://github.com/PigRiver/ThreadSantizerDemo
使用方法
target=》Edit Scheme卢佣。在Diagnostics tab下勾選Thread Sanitizer重荠。(可以選擇 Pause on issues)
具體內容
http://www.reibang.com/p/358535119e9b
使用Command-Line代碼:
clang -fsanitize=thread source.c -o executable
xcodebuild -enableThreadSanitizer YES
TSAN_OPTIONS=halt_on_error=1 ./executable
注意:
1. 在 WWDC 演講中,蘋果推薦在所有的單元測試里都打開 thread sanitizer虚茶。Sanitizer 只在運行時有效晚缩,而且必須要代碼運行到那兒才能檢測出線程競態(tài)。如果你的代碼單元測試覆蓋率很高媳危,那么 Thread Sanitizer 能找出工程里絕大部分的線程競態(tài)荞彼。
2. Tsan只會幫你在重現(xiàn)問題時精準地找到問題所在,而不會幫你重現(xiàn)問題待笑。
3. 只支持64位的測試機調試鸣皂。不支持真機。
原理:
圖1表明,Tsan是在生成exec時才綁定到程序中寞缝,所以:通用clang編繹的語言癌压,都可以使用Tsan來定位線程沖突問題。
當進行每一個內存訪問時荆陆,都通過check滩届、code對線程進行標記,記錄讀數(shù)據的時間被啼。
在Shadow State中記錄thread對數(shù)據的寫操作帜消。
每次thread寫操作時,對比線程讀數(shù)據的時間與Shadow State最近一次的寫操作的時間浓体。
二. Static Analysis:一個常見的 debug 的工具
Static Analyzer 能夠檢測出三種新的錯誤, 它們分別是:
Localizability
?本地化信息缺失的問題,目前能夠檢測出來兩種類型的錯誤, 一種是沒有使用 NSLocalizeString 這樣的 API, 而直接給控件設置 Sting 的情況, 一種是使用了相應的 API, 但在 comment 信息里面賦值為 nil.
Instance Cleanup
在 MRC 的代碼中, 尤其在 dealloc 中,我們不應該對 assign 類型的屬性進行 release 操作,應該對 retain 或者 copy 類型的屬性進行 release 操作, 如果不這樣操作的話,會引發(fā)一些不必要的麻煩.
Nullability
2015 年的 WWDC 大會上, Objective-C 引入的一個新特性就叫做 Nullability, 用于表明一個東西到底可以為 nil 還是不可以為 nil .
一般什么時候會出現(xiàn) nullability 方面的錯誤呢?
Objective-C 與 Swift 混編的場景
在代碼中有一些邏輯錯誤
不正確的注釋
為什么我們需要使用與 nullability 相關的關鍵字?
便于跟 Swift 的交互
方便使用者明白開發(fā)者的意圖
能夠將一些不必要的問題提前到編碼階段, 而不是到用戶使用時才暴露泡挺。
三. 總結:
1. 我們可以通過Tsan來協(xié)助修復線程競態(tài)問題。
2. Tsan的實現(xiàn)原理命浴。
3. Static Analysis支持分析更多的問題娄猫。
參考:
http://www.reibang.com/p/074072c33916
http://www.reibang.com/p/358535119e9b