Xcode
iOS
SENSYDay 19

問題検出をするためにXcodeのCode Diagnosticsを利用する。

SENSY株式会社のnamcoです。
業務ではiOS APPの開発をしています。

今回は、xcodeのScheme - Diagonosticsを見直した時の内容を、備忘録として書き残しておこうと思

下記のような流れで。
1. Address Sanitizer
2. Thread Sanitizer
3. Main Thread Checker
4. Undefined Behaviour Sanitizer
5. まとめ

Address Sanitizer

Address Sanitizer

  • 実行時にメモリ破損やその他のメモリエラーを検出するツール。
  • チェックを有効にしてコードを実行すると、CPUの速度が2〜5倍に低下し、メモリ使用量が2〜3倍に増加する。
  • 検証例: SwiftのAddress/Thread Sanitizer

Thread Sanitizer

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

  • Main Threadで呼ばれるべき処理が、Main Thread以外で呼ばれていないかを実行時にチェックしてくれる。
  • CPUのオーバーヘッドは1〜2%、プロセスの起動時間は0.1秒未満。
  • デフォルトで有効になっているが、問題の箇所でプログラムの実行を止めたい場合はPause on issuesにもチェックをつける
  • 検証例:iOS 11 Xcode 9で“だいぶまとも”に!新機能をまとめてみた

Undefined Behaviour Sanitizer

Undefined Behaviour Sanitizer

まとめ

  • Main Thread Checker以外は、どれを利用するにしても、パフェーマンスへの影響が大きいので、各種設定を有効にしたschemaを作っておき、デバッグしたい時のみ利用するのが良さそう。
  • 諸々の使い方をappleが動画で解説してくれている。年末年始に確認しよう。
    Finding Bugs Using Xcode Runtime Tools

下記参考にさせていただきました。ありがとうございます。

参考

SwiftのAddress/Thread Sanitizer
Finding Bugs Using Xcode Runtime Tools
iOS 11 Xcode 9で“だいぶまとも”に!新機能をまとめてみた

以上です。