25

ソース コード (または問題のある場所のデバッグに役立つもの) の行番号をデバッガから取得して、問題の発生場所を示すことは可能ですか?

エラーが発生します:

-[NSCFArray objectAtIndex:]: index (-1 (or possibly larger)) beyond bounds (9)

これは明らかに、ある時点で限界を超えていることを意味しますが、可能であれば、問題の解決に役立つ情報をさらに入手したいと考えています.

ブレークポイントを配置して、プログラムを 1 行ずつ実行しようとしていますが、面倒なプロセスです。ありがとう!

4

2 に答える 2

84

デバッガーが停止したら、「Debug Navigator」に移動し、下部のスライダーが右端にあることを確認します。

例外がスローされた時点から目を凝らすと、最終的には独自のコードにたどり着くはずです。適切なメソッド/関数名をクリックすると、コードがエディターで開かれます。

ここに画像の説明を入力

ここに画像の説明を入力

スタック トレースに独自のメソッドが表示されない場合は、performSelector-style 呼び出しによって例外が渡された可能性があります。この場合、スタック トレースは失われています。このような場合は、"On Throw" 例外ブレーク ポイントを追加すると、より良い情報が得られる場合があります。最初に「ブレークポイント ナビゲーター」に切り替えます。

ここに画像の説明を入力

次に、プラスをクリックして、[例外ブレークポイントを追加...] を選択します。

ここに画像の説明を入力

「オン スロー」ブレーク ポイントを作成します。

ここに画像の説明を入力

これにより、例外がスローされた正確なポイントでデバッガーが停止し、より適切なスタック トレースが得られます。このような例外ブレークポイントを常に有効にしておくことをお勧めしますが、Apple コードから内部例外が発生することがあります (QLPreviewController、MPMoviePlayerController を使用している場合など)。

于 2012-05-08T15:19:14.080 に答える
10

NSSetUncaughtExceptionHandler の使用も検討する必要があります。(クラッシュログをディスクに保存したり、新しいクラッシュログが保存されていれば次回の起動を確認したり、メールに添付したりできます。)

これを didFinishLaunchingWithOptions メソッドに入れます:

NSSetUncaughtExceptionHandler(&exceptionHandler);

例外ハンドラーを実装します。

void exceptionHandler(NSException *exception)
{        
    NSLog(@"%@",[exception name]);
    NSLog(@"%@",[exception reason]);
    NSLog(@"%@",[exception userInfo]);
    NSLog(@"%@",[exception callStackSymbols]);
    NSLog(@"%@",[exception callStackReturnAddresses]);
}
于 2014-08-28T14:20:43.027 に答える