2009-09-03 10 views
8

Xcode/objective cは実際には有用なスタックトレースを出力しません。私のアプリがどこかでクラッシュすると、45353453、34524323、6745345353、457634524234のような数字しか得られません。全く役に立ちません。アプリの現在のスタックトレースを簡単に印刷できますか?

だから私はNSLog()を作りたいと思います。私はすべてのアプリにすべてのメソッドの初めにあります。しかし、たぶん人間の目に見える本当のスタックトレースを見つける簡単な方法がありますか?アプリの起動やクラッシュだけでなく、すべてのアクティビティに発生するすべての時間、いつですか?多くのデバッグに役立ちます。

+0

デバッガでスタックトレースをたどることができ、それは私が – Daniel

+0

考えるクラッシュ前の最後のメソッド呼び出しにあなたを取る必要がありますいいえ、デバッガ情報はあまり役に立ちません。 –

+1

デバッガの情報が役に立たないのはなぜですか?デバッガでアプリケーションを起動してクラッシュした場合、デバッガは、呼び出された各行を確認するために戻ることができる素敵なスタックトレースを表示する必要があります。例外でアプリケーションが停止している場合は、そのデバッグ方法に関するalex_cの回答を参照してください。 –

答えて

1

実際には、アプリ内からこれを確実に行う方法はありません。あなたのアプリがクラッシュしていてシンボルを与えていない場合は、デバッグバージョンではなく、リリース版を削除したような感じがしますか?あなたの周りに座ってストリップされていないバージョンをお持ちの場合は

、あなたはこれらの数字とatosコマンドを使用してスタックフレームの実際の名前の間で相関させることができます(ターミナルでman atosを参照するか、XcodeののドキュメントやGoogleにatosを検索)。

おそらく、すべてのメソッド呼び出しのスタックを記録したくないでしょう。大量の情報はすぐに圧倒されます。また、アプリのメソッドのほとんどが呼び出されている理由について謎であってはなりません(ただし、UIKitとアプリのインターフェースがどうなるのか理解するのに時間がかかります)。

4

このような何かが同様にあなたに役立つかもしれない


@implementation UIApplication (MyCategory) 

+ (void)logStackTrace { 
    @try { 
     [[NSException exceptionWithName:@"Stack Trace" reason:@"Testing" userInfo:nil] raise]; 
    } 
    @catch (NSException *e) { 
     NSLog(@"%@", [e callStackSymbols]); 
    } 
} 

@end 
+8

これはiOS 4よりも前に便利です。iOS 4以降では[NSThread callStackSymbols]を使用してください。 –

関連する問題