エラー発生時に確認すること

主に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