xcrun simctl diagnoseは、シミュレータ関連の診断情報・ログをまとめて収集するサブコマンドである。
sysdiagnoseを補完する情報を集める位置付けで、バグ報告時に添付することが想定されている。
実行前にプライバシーに関する確認プロンプトが表示される
diagnoseを実行すると、収集したファイルにApple ID関連情報などの個人情報が含まれうる旨の注意書きが表示され、Enterキーでの同意を求められる。
$ xcrun simctl diagnose --udid="TIL Diagnose iPhone"
This tool generates files that allow Apple to investigate issues with the
Simulator and help improve Apple products. ...
Press ENTER to continue
標準入力からの応答を待つため、CIなど非対話環境でそのまま実行すると入力を待ち続ける。 標準入力が端末に接続されていない環境では、何も収集せずに終了コード0で即座に終了することもある。 自動化する場合は、標準入力に改行を1つ渡すことでプロンプトを通過できる。
$ echo "" | xcrun simctl diagnose --udid="TIL Diagnose iPhone"
--outputの意味は--no-archiveの有無で変わる
デフォルトでは収集結果を.tar.gzに圧縮する。
--outputに指定したパスは、この場合アーカイブファイル名(拡張子.tar.gzが自動付与される)として使われる。
$ echo "" | xcrun simctl diagnose -b --udid="TIL Diagnose iPhone" --output=./mydiagnose
...
Successfully wrote simctl diagnose archive to './mydiagnose.tar.gz'
--no-archiveを付けると圧縮せず、--outputに指定したパスがそのまま出力先ディレクトリになる。
$ echo "" | xcrun simctl diagnose -b --no-archive --udid="TIL Diagnose iPhone" --output=./mydiagnose
...
Successfully wrote files to './mydiagnose'
$ ls ./mydiagnose
CoreSimulator.log DiagnosticReports device_set.plist diagnose.log dyld_cache_logs ...
-bは完了後にFinderで結果を表示しない指定であり、GUIセッションのない環境で実行する場合に付けておくと安全である。
収集にはタイムアウトを設定できる
--timeout=<秒数>で、ログ収集にかける最大時間を指定できる。
指定しない場合はデフォルトで300秒のタイムアウトが適用される。
$ echo "" | xcrun simctl diagnose -b --timeout=30 --udid="TIL Diagnose iPhone"
...
This operation will time-out after 30 seconds.
-Xを付けた場合のみタイムアウトなしになり、収集が完了するまで待つ。
このとき--timeoutを指定していても無視される。
--udidでデバイスを絞り込める
--udid=<device>を複数回指定すると、対象デバイスを複数選べる。
ただし--all-logsを付けると--udidの指定はすべて無視され、起動していないデバイスも含めた全デバイスが対象になる。
アーカイブには対象デバイス固有の情報だけでなく、dyld_cache_logsのようにインストール済みの全ランタイムに関するホスト側のログも含まれる。
