2

Ok。SIGABRTそのため、私が取り組んでいる複雑な Objective-C iOS プログラムでこの非常に奇妙なエラーが発生し、1 日追跡した後、犯人を見つけました。

次のコードがあるとします。

NSArray *a = [NSArray arrayWithObjects:@"a", @"b", @"c", nil];
NSLog(@"tada: %@", [a objectAtIndex:-1]);

なぜこれでプログラムが終了しProgram received signal: SIGABRT、デバッガーは私のコードを指していません (むしろ、アセンブリ部分では)

プロジェクトの設定を台無しにしたと思ったので、これを新しいプロジェクトで再現しました。同じ結果です。

XCode をより適切に構成し、この種のエラーをより人間が理解できる方法で示す方法はありますか?

4

2 に答える 2

2

ドキュメントが言うように

インデックスが配列の終わりを超えている場合(つまり、インデックスがcountによって返される値以上の場合)、NSRangeExceptionが発生します

そして、例外ハンドラが定義されていない場合のデフォルトのアクションは...まあ...デフォルトの動作が何であるかを確認できます。

@ try / @ catchを使用して例外をトラップできますが、それは実際にはObjective-C風ではありません。配列に含まれる要素の数を知っています。存在しない要素にアクセスする必要はありません。

このような例外には通常、スタックトレースがあるため、エラーの原因となっているコード行に戻ることができます。(正しく機能していない場合は、LLDBとGDBを切り替える価値があるかもしれません。LLDBはより高速で小型ですが、完全に信頼できるわけではありません。)

于 2012-04-13T13:01:28.640 に答える
2

Xcodeのコンソールログを見ると、「範囲外のインデックス」の線に沿って何かが表示されるはずです。SIGABRTは、アサーションが実行された結果です。メッセージを印刷するために、クラッシュ後に[続行]をクリックしなければならない場合があります。

デバッガーは、クラッシュが実際に発生した場所を通知します。元の原因が何であったかはわかりません。デバッガーがアセンブラーを表示したままになっている場合は、コードに到達するまでスタックを上に移動します。

于 2012-04-13T13:01:47.677 に答える