Xcode実機デバッグで発生するSIGABRTの解決法
- 執筆
- 小幡十矛
- 公開日
結論:Thread 1: signal SIGABRTは原因名ではなく、プロセスがabortシグナルを受けて終了した結果です。最初にコンソールとクラッシュレポートを読み、Last Exception Backtraceがあるか、dyldとLibrary not loadedがあるかを分けます。Clean Buildは原因を特定した後の再確認に使います。
要点:SIGABRTを一つの原因として扱わず、例外メッセージ、クラッシュしたスレッド、Last Exception Backtrace、dyldの記録を順に確認します。再現できる例外はException Breakpointで停止し、欠けたFrameworkはリンクと埋め込みを確認します。
SIGABRTで最初に見る場所
| ログの手がかり | 考える分類 | 最初の確認 |
|---|---|---|
Last Exception Backtrace | 未処理の言語例外 | 例外メッセージと呼び出し履歴を読む |
dyldとLibrary not loaded | 必要なFrameworkがアプリ内にない | 対象Frameworkのリンクと埋め込みを確認する |
| クラッシュしたスレッドの先頭 | アプリが実行していた処理 | シンボル化されたフレームから対象コードを絞る |
| 再現時のコンソール | 例外の具体的な理由 | 例外メッセージと該当APIの条件を確認する |
Apple公式ドキュメントは、SIGABRTが通常、abort()の呼び出しや未処理のObjective-C・C++例外などで送られると説明しています。クラッシュレポートのException Typeだけで原因を決めず、バックトレースと追加情報を合わせて読みます。
再現できる場合の診断手順
- Xcodeでデバッガを接続し、同じ操作でクラッシュを再現する
- コンソールに出る例外メッセージを読む
- Exception Breakpointを追加し、例外が投げられた位置で停止する
- 停止したフレームの変数と呼び出し履歴を確認する
- 仮説に沿ってコードまたは設定を直し、同じ操作で再テストする
Appleは、再現できる言語例外ではException Breakpointを設定し、Xcodeのデバッガでアプリの状態を調べる方法を案内しています。例外を投げたOS APIが分かったら、そのAPIの成立条件を公式資料で確認します。
dyld: Library not loadedがある場合
このメッセージがある場合は、アプリがFrameworkへリンクしていても、アプリバンドルへFrameworkが埋め込まれていない可能性を確認します。Apple公式は、アプリがFrameworkをビルド時にリンクし、動的Frameworkのコピーをアプリバンドルへ含める必要があると説明しています。
- メッセージに書かれたFramework名を確認する
- アプリTargetのFrameworks, Libraries, and Embedded Contentを確認する
- 必要な動的Frameworkがアプリバンドルへ入る設定か確認する
- Archiveまたは実機ビルドで同じ条件を再テストする
Clean Buildを使う位置
Clean Buildは、変更した設定や生成物を新しい状態で再確認する手段です。SIGABRTの原因を特定する代わりにはなりません。ログから原因の分類を決め、コードやFramework設定を整えた後に、同じ手順で再現しないことを確認します。
約10年のiOS開発で大切にしている順番
僕はiOSを含むITサービス・チーム開発を約10年経験し、サイバーエージェントではABEMA LiveのiOSアプリ開発とテックリードを担当しました。デバッグでは、対処法を先に増やすより、ログにある事実を一つずつ分類します。再現条件、例外、フレーム、変更点を残すと、チームでも同じ判断をたどれます。
次に読む記事
よくある質問
SIGABRTは何を意味しますか?
プロセスがabortシグナルを受けて終了したことを示します。原因は一つではないため、例外情報、クラッシュしたスレッド、バックトレース、コンソールを合わせて確認します。
Thread 1で止まった行が原因ですか?
表示された行だけで原因を確定できるとは限りません。Apple公式が案内するように、クラッシュレポート全体とバックトレースを読み、例外を投げた処理までたどります。
Clean BuildだけでSIGABRTを解消できますか?
Clean Buildは変更後の再確認に使えます。先にログから例外またはFramework不足などの分類を決め、原因に沿った修正を行います。
dyld: Library not loadedが出たら何を確認しますか?
メッセージにあるFramework名を確認し、アプリTargetでリンクされ、必要な動的Frameworkがアプリバンドルへ埋め込まれる設定になっているかを確認します。
クラッシュの手がかりを、次の一手へ整理する
ログ、再現条件、直前の変更を持ち寄ると、調べる順番を1:1で整理できます。原因を決めつけず、検証できる一手へ分けましょう。