エラー発生時に確認すること
エラー発生時に確認すること
主にXcodeなどで開発する時の場合を想定したメモ。
今まで自分がiOSアプリの開発をしていて遭遇した現象を、思いつくかぎりまとめてみた。
以下、iOS
と表記している部分はiPadOS
においても同様。
注:自分は今年の5月以降はあまり開発をしていないので、もしかすると多少古い情報もあるかも?
原因調査する際に、まず気を付けること
- 調べたことや試したことを、都度メモしながら調査した方が良い
- なかなか原因がわからない場合、メモせずに進めると混乱しがち
- メモすることで頭の中が整理されて何か閃いたりする
- 他の人に助けを求める場合にも、このメモが役立つ
基本的に確認すること
まずはエラーメッセージをよく読んで理解する。
- 解決方法が見つからない / わからない場合は以下をググってみる
- エラーメッセージ (カスタムクラス等を除いた全文)
- 問題の起こっているクラス名
- 問題の起こっている関数名
- 使用しているライブラリ名
- ライブラリに既知のバグはないか?
- 使用している環境(例:
Xcode 14.x.x
)- 環境に既知のバグはないか?
- ビルド対象を変えてみる
- 例:iOSなら、実機では発生するか?シミュレータではどうか?iOSのバージョンが違う場合は?
- ビルド環境を変えてみる
- 例:Xcodeの違うバージョンで発生するか?Macのバージョンが違う場合は?ライブラリのバージョンが違う場合は?
- 使用しているライブラリやクラスなどが、そのOSバージョンに対応しているか?
- プロジェクトをクリーンしてみる
- 一時ファイルを削除してみる
- Derived Dataなどを消してみる
- アプリをiOS端末やシミュレータから一旦削除してから再度試す
ビルド時のリンクエラーの場合
以下のようなプロジェクトの設定を確認する。
- ライブラリへのパスは正しく通っているか?
- ヘッダへのパスは正しく通っているか?
- 実行ファイル(
.cpp
や.mm
など)がプロジェクトへ登録されているか? - 実行ファイルの拡張子に誤りはないか?
.c
と.cpp
を混同すると、ビルドエラーになることも
実行時にクラッシュする場合
まずは どういう操作をしたらクラッシュするか をメモしておく。
- クラッシュ時における変数の値に異常はないか?
- ファイルを保存/読み込みする場合、そのファイルに異常はないか?
- 外部機器等とデータを送受信する場合、そのデータに異常はないか?
WireShark
等を使って調べる
- スタックトレースを見て、解決方法を考える
- スタックトレースに出てくるクラス名や関数名をググってみる
- デバッグ用のログを吐き(
NSLog
など)、どの部分の挙動がおかしいかを調べる- 場合によってはログをファイルへ書き出すのもあり。リモートデバッグができない時など
- メモリリークはしていないか?メモリ消費量が多すぎる可能性はないか?
- クラッシュするまでの手順が一定でない場合は怪しい
- クラッシュしたりしなかったりする場合も怪しい
- 無限ループは発生していないか?
- Xcodeではデバッグ実行時に無限ループが発生すると、アプリが中断されることもある(スタックトレースは見られる)
iOS特有の現象
- iOS端末の温度が高くなりすぎると、OSがアプリを落とすことがある
- 1秒間あたりのスレッド起床回数が150回を超えるとクラッシュログが発生
- →ログが出るだけで、アプリがクラッシュ等するわけではない
- アプリ起動時に時間がかかりすぎると、システムに落とされる場合もある(エラーコード:
0x8badf00d
)- デバッグ実行時には発生しない
デバッグ時のTips
- NSLogの内容をテキストファイルに書き出してそれをPCに持ってきたい
Objective-C
- NSLogの内容を書き出したい時はこれ
- コンピューター:C言語講座:freopenについて
- printfの内容を書き出したい時はこれ
- 【iOS11】徹底解説!クラッシュログを復元して解析する方法【watchOS4】
- ユーザから上がったクラッシュレポートを解析する際等に有用
- guard malloc, malloc_historyを使って、addressで何が起こったのかを調べる
- LLDBを使ってCのデバッグをする
- iOS(iPhone/iPad/iPod)でパケットキャプチャ