XcodeでSIGABRTエラーを解決する方法
Reinder de Vriesによって書かれたAugust6 2020In App Development,iOS
iOSアプリはXcodeで正常に動作し、次は絶望的に不可解なSIGABRTエラーでクラッシュした。….. どうしたんだ!?
このチュートリアルでは、次のことを学びます:
- Xcodeで”信号SIGABRT”エラーを解決する方法
- Xcodeでデバッグツールのいくつかを使用する方法
- 何SIGABRTの略であり、その原因は何ですか
- SIGABRTの根本原因を見つ 行こう”Thread1:Signal SIGABRT”とはどういう意味ですか?
- コンセントをチェックする
- スタックトレースをチェックする
- 例外ブレークポイントを作成する
- 続きを読む
- 左側には、アプリがクラッシュしたときに実行されたスレッドのリストが表示されます。 クラッシュの原因となったスレッドがメインスレッド、つまり”スレッド1″であることがわかります。
- エディタでは、恐ろしいスレッド1:シグナルSIGABRTエラーが表示されます。 エディタの12行目、
AppDelegate
のクラス定義が強調表示されています。 - 下部には、役に立つデバッグ出力が表示されます。 この場合、stacktraceが表示され、”key value coding-compliant”ではないという不可解なエラーメッセージが表示されます。”
- Sigabrtエラーは、Xcodeでその行を強調していても、通常、
AppDelegate
AppDelegate
クラスを見て時間を無駄にしないでください。 - stacktraceは、アプリのクラッシュにつながる関数呼び出しのリストです。 これは、エラーの原因となったコード行がstacktraceのどこかにあることを意味するものではありません。 それは時々ありますが、他のケースでは、stacktraceは単にあなたがあなた自身のコードの他の場所で設定した値で窒息したコードにつながります。
- SIGABRTエラーに目をつぶってはいけません。 エラーには合理的で論理的な原因があります。 それはおそらくあなた自身のコードのバグであり、それには何も問題はありません。 アプリは魔法ではなく、誰もあなたを得るために出ていない、とバグが青の外に表示されることはありません。 “それは昨日うまく走った!”-それは常にありません、そして今ではありません!ベースラインを確立したので、SIGABRTの最初の原因を見てみましょう。
iOSアプリのビルド方法を学ぶ
iOS14とSwift5を使い始める
私のiOS開発コースにサインアップして、Swift5とXcode12で優れたiOS14アプリをビルドする方法を学びます。
コンセントをチェックする
“Signal SIGABRT”の一般的な原因は、コンセントのタイプミスやバグです。 ここで何が起こったのですか:
- Interface Builderで新しいview controllerを作成し、ボタンやラベルなどのいくつかのUI要素で設定しました
- これらのUI要素をoutlet propertiesを使用してコードに接続しました。xibファイルを使用してview Controllerのuiを生成します あなたのアプリが実行されたとき(大まかに言えば)。 この時点で、xibからview controllerクラスのプロパティにアウトレットも接続します。
アウトレットプロパティの名前を変更した場合、アプリはそれを見つけることができません。 そのため、例外がスローされます。 SIGABRTエラーの原因は、その例外を処理していません。Xcodeでは次のようになります。
何が起こっているのか見てみましょうか? プロパティは
otherButton
と呼ばれていますが、コンセントはまだボタンと呼ばれています。 ある時点で、私たちはコンセントを変更しました–新しい名前が優れているので–そしてそれがクラッシュしたアプリを混乱させました。stacktraceの上部には、別の手がかりもあります。Terminating app due to uncaught exception 'NSUnknownKeyException', reason: ': this class is not key value coding-compliant for the key button.
それはどういう意味ですか? アプリは、この時点で、view controllerがキー
button
のキー値コーディングに準拠していないことを示しています。 これは、view controllerでbutton
プロパティが見つからないことを意味します。 そして、それは本当です、私たちはそれを名前を変更したので。iOSは、キー値コーディングと呼ばれるメカニズムを使用して、view controllerが持つプロパティを検査するため、これらのプロパティを使用してXIBに基づいて作成されたUI要素を参照することができます。この時点でどのようにバグを解決しますか?
2つの方法を使用できます。
- プロパティの名前を元の名前に戻します。
- Interface Builderでコンセント接続を削除し、新しいコンセントプロパティ名を使用して再接続します。
簡単なヒント:変更されたのと同じように
@IBOutlet
@IBAction
を使用してアクションの名前を誤って変更すると、SIGABRTエラーが発生する可能性があります。スタックトレースをチェックする
多くの場合、XcodeはSIGABRTクラッシュのための有用なエラーメッセージを表示しません。 その場合は、
bt
のようないくつかのデバッグコマンドを知っておくと便利です。XcodeにはLLDBと呼ばれる統合されたデバッグ環境があります。 これは、アプリの実行時にXcodeの下部、コンソールまたはデバッグ出力領域に表示されるものです。 ここではデバッグメッセージをよく見ますが、コマンドの入力にも使用できることを知っていましたか?次回アプリがクラッシュしたときは、lldbに
help
と入力してみてください。 次のようにします。lldbコマンドの多くは、ブレークポイントの設定、コード行のステップオーバー、ランタイム値の検査など、デバッガで実行できるアクションに直接対応していることがわかります。
一つのコマンドは特に便利です。 現在のコールスタック(”backtrace”または”stacktrace”とも呼ばれます)を表示するには、
bt
と入力します。 これは、現在のクラッシュまで実行されたすべての関数のリストです。 このトレースには、通常、バグの原因となった関数が含まれます。ここでは、典型的なインデックス範囲外エラーのstacktraceをチェックしてください。 下のスクリーンショットでは、4つの項目しか持たない配列からindex
99
bt
は、エラーの原因となったコード行を教えてくれます。p>stacktraceで次の情報を見つけることができますか?
- 問題のコードは、
ViewController.swift
viewDidLoad()
関数 - あなたも、我々はの添字”ゲッター”を使用していることがわかります
Array
- クラッシュする前に、view controller関連の関数呼び出しの全体の束私たちが得た情報に基づいて作られました
bt
、コード内の問題のある行を見つけて修正することができます。 Xcodeは、エディタでエラーを強調表示することで、この場合にはすでに私たちを助けました。 いくつかのシナリオでは、そのような運がないので、bt
print
print names
と入力すると、次の出力が生成されます。() $R0 = 4 values { = "Ford" = "Arthur" = "Zaphod" = "Trillian"}
複雑なオブジェクトを印刷するには、
po
。 すごい!stacktraceはoutside-inで実行されることに注意してください。 スタックトレースの下部にはトップレベルの関数呼び出しが表示され、スタックが高くなるほど呼び出しが深くなります。 最新の最新の最深レベルの呼び出しは、スタックの最上部にあります。ブレークポイントを使用して、特定の行でコードの実行を停止することができます。 その時点で、値を検査し、関数をステップ実行できます。例外ブレークポイントは、コード内で例外が発生するたびにトリガーされます。 ブレークポイントがトリガーされる行を指定する代わりに、例外のコード実行を停止するようにデバッガーに指示します。
例外ブレークポイントは、例外が発生したときにコードを検査するのに役立ちます。 どのコード行が例外をスローしたかを確認でき、その時点でコード内の値を調べることができます。 一部の例外は、バグやアプリの無効な状態によって引き起こされるため、例外ブレークポイントはそれらのバグを見つけて修正するのに便利です。
例外ブレークポイントを設定する方法は次のとおりです:
- 左のタブを使用して、Xcodeのブレークポイントナビゲータに移動します
- 左下をクリックします
+
-ボタンを選択し、例外ブレークポイント - デフォルト設定をそのままにしておきます(カスタマイズするのに役立ちます)
- コードを実行します
例外がスローされると、アプリの実行が停止します。 デバッガーを使用して値を検査し、コードをステップ実行し、LLDBコマンドを使用できるようになりました。 可能であれば、Xcodeは例外の原因となったコード行に移動します。
例外が必ずしもアプリをクラッシュさせるわけではないことに注意してください! そのため、例外ブレークポイントが有効になっていて、例外が発生すると、アプリは停止します。 ブレークポイントでコードを停止することは、アプリのクラッシュと同じではないので、混乱させないでください。
たとえば、exceptionブレークポイントはUnsatisfied constraints例外によってトリガされますが、それはあなたのアプリをクラッシュさせません。 例外ブレークポイントを使用してSIGABRTクラッシュの追加情報を収集し、バグを解決したら(再び必要になるまで)無効にします。
iOSアプリのビルド方法を学ぶ
iOS14とSwift5を使い始める
私のiOS開発コースにサインアップして、Swift5とXcode12で優れたiOS14アプリをビルドする方法を学びます。
さらに読む
SIGABRTエラーは非常に不可解であり、解決するのが困難であることが証明されています。 Xcodeが有用なエラーメッセージを表示できないのはなぜですか? さて、それは良い質問です…
簡単な答えは、Ios開発には非常に多くの可動部分があり、Xcodeが常にクラッシュの原因を特定できないということです。 Xcodeは、あなたが誤ってコンセントの名前を変更したことを知りません。 コンセントを接続する際に、いくつかのコードが呼び出され、それが例外を引き起こしたことだけを知っています。これは、可能な限り根本原因に近いエラーが常に表示されることを意味します。
これは、可能な限り根本原因に近いエラーが常に表示されることを意 あなたができる最善のことは、多くの間違いを犯し、多くのエラーメッセージを解読し、それらをよりよく知ることです。 そして、あなたがこのチュートリアルで学んだことは、SIGABRTエラーを見つけて解決する方法です!
もっと知りたいですか?
もっと知りたいですか? 以下のリソースをチェックしてください。
- Xcodeでのデバッグを始める
- Xcodeでの”Unrecognized Selector Sent to Instance”エラーの理解
- Xcodeでの”Unrecognized Selector Sent to Instance”エラーの理解
- Xcodeでの”Unrecognized found nil while unwrapping An Optional value”エラーの理解
- Xcodeでの”Unresolved Identifierの使用”エラーの理解
- Swiftプログラミングでのオフバイワンエラー
- Do-Try-Catchを使用したSwiftでのエラー処理
“Thread1:Signal SIGABRT”とはどういう意味ですか?エラー SIGABRTは”signal abort”の略です。 これは、オペレーティングシステムであるiOSから実行中のアプリに送信される信号で、実行時エラーのためにすぐにアプリを終了します。 それは本質的にあなたのアプリがクラッシュしたことを意味します…
Xcodeでは次のようになります。
スクリーンショットでは、いくつかのことが表示されます。
SIGABRTエラーの問題は、それがあまりにも一般的であるということです。 Xcodeは基本的に言っています:「見て、あなたのアプリがクラッシュしました、それは私たちが知っているすべてです。”SIGABRTエラーのほとんどの場合、エラーの原因についての情報はほとんど得られません。
先に進む前に、SIGABRTのいくつかの誤解と一般的な落とし穴について説明しましょう。