22

スタック トレースを iPhone のローカル ファイルに出力するために使用NSSetUncaughtExceptionHandlerします。このファイルは、次にアプリを起動したときにサーバーに送信されます。その後、例外データを調べてバグを修正できます。一部のクラッシュでは、モジュール名と例外をスローした関数があり、これらは簡単です。しかし、ほとんどの場合、次のようなものがあります。

"4   libc++abi.dylib 0x35bba3c5 _ZL19safe_handler_callerPFvvE + 76",
"5   libc++abi.dylib 0x35bba451 _ZdlPv + 0",
"6   libc++abi.dylib 0x35bbb825 __cxa_current_exception_type + 0",
"7   libobjc.A.dylib 0x37bab2a9 objc_exception_rethrow + 12",
"8   CoreFoundation  0x3575a50d CFRunLoopRunSpecific + 404"

たとえば、理由は次のとおりです。

*** -[__NSArrayI objectAtIndex:]: index 0 beyond bounds for empty array

しかし、アプリには数十の配列があるため、スタック トレースから取得したデータを使用して、例外をスローした特定の行を見つける手助けが必要です。

ソース コード内の問題のある行を見つけるために、スタック トレース内の数字をデコードする方法を学ぶことができる、Apple またはその他の優れた記事/チュートリアルを知っている人はいますか。前もって感謝します!

4

4 に答える 4

2

スタック トレースから行番号を取得する方法は (まだ) わかりませんが、行番号を出力したいコードのいくつかのポイントで、次のコード フラグメントを使用しました。

NSLog(@"%s line=%d", __func__, __LINE__);

次の出力が得られます。

2013-04-01 00:16:46.393 MyApp[847:c07] -[AppDelegate application:didFinishLaunchingWithOptions:] line=29

Log4J フレームワークに精通している場合は、さまざまなプロジェクトで非常に役立つことが証明されている Lumberjack フレームワークを確認することをお勧めします。

https://github.com/robbiehanson/CocoaLumberjack

これはあなたの質問に直接答えるものではないかもしれませんが、単なるリマインダーとしてのものです.

于 2013-03-31T22:21:46.513 に答える
-1

catchブロックにブレークポイントを設定します。コードのフローが停止したら、「bt」などのgdbコマンドを使用できます。

于 2012-09-23T01:27:05.843 に答える
-1

例外に保存されているスタック トレースを出力し[exception callStackSymbols]ます[exception callStackReturnAddresses]。iOS 5 以降の Apple のクラッシュ ログでは、これは「Last Exception Backtrace」として上部に表示されます。

表示されているのは、例外が再スローされたときのコール スタックです。これは、try...finally. なぜ Apple がこの変更を行ったのか正確にはわかりません (おそらく、実行ループを例外的に安全にするためでしょうか?)。

于 2012-09-23T02:20:53.437 に答える