2012-05-08 7 views
22

デバッガからソースコード(または問題のある場所でのデバッグに役立つもの)の行番号を取得できますか?問題の発生元を示していますか?目的C - デバッガのエラーから回線番号またはスタック全体のトレースを取得していますか?

私はエラーを取得しています:

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

明らかにそれが可能に私は私が問題を解決するのに役立ついくつかのより多くの情報を取得したいと思いただし場合、私は、いくつかの点で範囲外つもりだことを意味しています。

私はブレークポイントを配置し、行ごとにプログラムを実行しようとしていますが、それは退屈なプロセスです。ありがとう!

答えて

81

デバッガが停止したら、「デバッグナビゲータ」に移動して、下のスライダが右端にあることを確認します。

例外がスローされた時点から目を走査し、最終的にあなた自身のコードに行きます。適切なメソッド/関数名をクリックすると、コードがエディタで開きます。

enter image description here

enter image description here

あなたはスタックトレースで独自の方法のうちのいずれかが表示されない場合は、例外がperformSelectorスタイルの呼び出しを通過されている可能性があり、その場合には、スタックトレースがなくなっています。このような場合は、「スロー時」の例外ブレークポイントを追加すると、より良い情報が得られる場合があります。 「ブレークポイントナビゲーター」への第一のスイッチ:次に

enter image description here

プラスをクリックして選択し、「例外ブレークポイントを追加...」

enter image description here

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

enter image description here

これは、正確なポイントでデバッガを停止します例外がスローされ、より良いスタックトレースが得られます。アップルのコード(QLPreviewController、MPMoviePlayerControllerなど)で内部例外を取得することもありますが、このような例外ブレークポイントを常に有効にすることをお勧めします。

+0

Sweet!マイクありがとう! Xcode 3.xに類似したものはありますか?私は自宅でXcode 4.3を使用しますが、仕事ではまだXcode 3です。再度感謝します。 – Kevin

+2

まだXcode 3を使用していますか?それはかなり悪い考えです。 –

+0

私の上司に教えてください!あなたの助けてくれてありがとうMike。 – Kevin

7

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

あなたのdidFinishLaunchingWithOptionsメソッドにこれを置く:

NSSetUncaughtExceptionHandler(&exceptionHandler); 

例外ハンドラを実装してください:

void exceptionHandler(NSException *exception) 
{   
    NSLog(@"%@",[exception name]); 
    NSLog(@"%@",[exception reason]); 
    NSLog(@"%@",[exception userInfo]); 
    NSLog(@"%@",[exception callStackSymbols]); 
    NSLog(@"%@",[exception callStackReturnAddresses]); 
}