9

次のインデックス範囲外エラーが発生しています。

*** Terminating app due to uncaught exception 'NSRangeException', reason: 
'*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'
*** First throw call stack:
(0x2263052 0x24c7d0a 0x224fdb8 0x2f4a7 0x2264ec9 0x81e299 0x81e306 0x75aa30 
0x75ac56 0x741384 0x734aa9 0x39a9fa9 0x22371c5 0x219c022 0x219a90a 0x2199db4 
0x2199ccb 0x39a8879 0x39a893e 0x732a9b 0x1e5b 0x1dc5 0x1)

エラーの意味は正確にわかっていますが、これらのエラーを修正するのは非常に難しいと思います。これは、何らかの理由で、配列が呼び出されたコード行がコール スタックに表示されないためです。スレッド 1 からのコール スタックは次のとおりです。

#0  0x9706d9c6 in __pthread_kill ()
#1  0x93e2cf78 in pthread_kill ()
#2  0x93e1dbdd in abort ()
#3  0x02859e78 in dyld_stub__Unwind_DeleteException ()
#4  0x0285789e in default_terminate() ()
#5  0x024c7f4b in _objc_terminate ()
#6  0x028578de in safe_handler_caller(void (*)()) ()
#7  0x02857946 in __cxa_bad_typeid ()
#8  0x02858b3e in __cxa_current_exception_type ()
#9  0x024c7e49 in objc_exception_rethrow ()
#10 0x02199e10 in CFRunLoopRunSpecific ()
#11 0x02199ccb in CFRunLoopRunInMode ()
#12 0x039a8879 in GSEventRunModal ()
#13 0x039a893e in GSEventRun ()
#14 0x00732a9b in UIApplicationMain ()
#15 0x00001e5b in main

ご覧のとおり、このコール スタックはあまり役に立ちません。コードのメソッドが表示されないからです。また、エラーに表示されている呼び出しスタックには 22 のメモリ アドレスがありますが、スレッド 1 からのスタックには 15 しかなく、アドレスはまったく一致しません。他のスレッドには有用な情報が含まれていないようです。

エラー (22 個のアドレスを持つもの) から「First throw call stack」のスレッドを確認して、このエラーの原因となっている行を見つけるにはどうすればよいですか? ビルド設定で何かが正しく設定されていないために、関連するスタックを取得できなくなっている可能性がありますか?

誰かがこれについて正しい方向に私を向けることができれば、私はとても感謝しています. 問題のある行を手動で見つけようとするのは非常に面倒です。

ありがとう!

4

3 に答える 3

17

デバッガーをオンにし、例外がスローされるたびにブレークポイントをオンに設定します。これにより、コードのどの行がジャークであるかを正確に知ることができます。

objc_exception_throw

または、[NSExceptionレイズ];

次の質問を見てください:objc-exception-throwにブレークポイントを追加します

于 2011-11-23T09:21:06.430 に答える
2

プロジェクトでグローバル ブレークポイントを有効にしましたか? プロジェクト ナビゲーターのブレークポイント セクションに objc_exception_throw を追加せずにアプリを再実行すると、スタックが取得されます。さらに、クラッシュが発生した場合は、追加のスレッドを監視して展開し、それらのスタックも確認します。クラッシュはメインスレッドによって報告されていましたが、検索していたスタックがバックグラウンドスレッドにあることが何度かありました。HTH。

于 2011-11-23T09:26:00.523 に答える
0

これが XCode デバッガーで発生したと仮定すると、トレースバック アドレスで参照されているコード行を特定できます。デバッグ ウィンドウで、次のように入力します。

list *トレースバックからのアドレス

たとえば、最初のエントリの場合、次のように入力します: list *0x2263052

これをアドレスごとに行います。そのうちの 1 つはプログラム コードを指し、失敗した行番号と失敗した行の上下にコードをリストする必要があります。

-スティーブ

于 2015-02-05T16:45:42.207 に答える