SENSY株式会社のnamcoです。
業務ではiOS APPの開発をしています。
今回は、xcodeのScheme - Diagonosticsを見直した時の内容を、備忘録として書き残しておこうと思
下記のような流れで。
- Address Sanitizer
- Thread Sanitizer
- Main Thread Checker
- Undefined Behaviour Sanitizer
- まとめ
Address Sanitizer
[Address Sanitizer]
(https://developer.apple.com/documentation/code_diagnostics/address_sanitizer)
- 実行時にメモリ破損やその他のメモリエラーを検出するツール。
- チェックを有効にしてコードを実行すると、CPUの速度が2〜5倍に低下し、メモリ使用量が2〜3倍に増加する。
- 検証例: SwiftのAddress/Thread Sanitizer
Thread Sanitizer
[Thread Sanitizer]
(https://developer.apple.com/documentation/code_diagnostics/thread_sanitizer)
- スレッドセーフになってないオブジェクトに、意図せず複数スレッドでアクセスしてしまった時に検知をして、警告を出してくれる。
- Thread Sanitizerのチェックを有効にしてコードを実行すると、CPUが2〜20秒遅くなり、メモリ使用量が5〜10倍に増加する。
- 64ビットMacOSおよび64ビットiOSおよびtvOSシミュレータ(watchOSはサポートされていません)でのみサポートされている。デバイスでアプリケーションを実行するときはTSanを使用できない。
- 検証例: SwiftのAddress/Thread Sanitizer
Main Thread Checker
[Main Thread Checker]
(https://developer.apple.com/documentation/code_diagnostics/main_thread_checker)
- Main Threadで呼ばれるべき処理が、Main Thread以外で呼ばれていないかを実行時にチェックしてくれる。
- CPUのオーバーヘッドは1〜2%、プロセスの起動時間は0.1秒未満。
- デフォルトで有効になっているが、問題の箇所でプログラムの実行を止めたい場合はPause on issuesにもチェックをつける
- 検証例:iOS 11 Xcode 9で“だいぶまとも”に!新機能をまとめてみた
Undefined Behaviour Sanitizer
[Undefined Behaviour Sanitizer]
(https://developer.apple.com/documentation/code_diagnostics/undefined_behavior_sanitizer)
- 実行時に未定義の動作を検出する。
- デバッグ構成では平均20%のCPUオーバーヘッドがある。
- 検証例:iOS 11 Xcode 9で“だいぶまとも”に!新機能をまとめてみた
まとめ
- Main Thread Checker以外は、どれを利用するにしても、パフェーマンスへの影響が大きいので、各種設定を有効にしたschemaを作っておき、デバッグしたい時のみ利用するのが良さそう。
- 諸々の使い方をappleが動画で解説してくれている。年末年始に確認しよう。
[Finding Bugs Using Xcode Runtime Tools]
(https://developer.apple.com/videos/play/wwdc2017/406/)
下記参考にさせていただきました。ありがとうございます。
参考
SwiftのAddress/Thread Sanitizer
[Finding Bugs Using Xcode Runtime Tools]
(https://developer.apple.com/videos/play/wwdc2017/406/)
iOS 11 Xcode 9で“だいぶまとも”に!新機能をまとめてみた
以上です。