アサーションの失敗やキャッチされない例外など、特定の時点でのコールトレースをログに記録したい。
アサーションの失敗やキャッチされない例外など、特定の時点でのコールトレースをログに記録したい。
回答:
n13の答えはうまくいきませんでした-これを思いつくように少し修正しました
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char *argv[])
{
@autoreleasepool {
int retval;
@try{
retval = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
@catch (NSException *exception)
{
NSLog(@"Gosh!!! %@", [exception callStackSymbols]);
@throw;
}
return retval;
}
}
NSLog(@"[Error] - %@ %@", exception.name, exception.reason);
実際の例外も必要な場合は追加できます
Cocoaは、キャッチされていない例外のスタックトレースをすでにコンソールに記録していますが、それらは単なる生のメモリアドレスです。コンソールにシンボリック情報が必要な場合は、Appleのサンプルコードがいくつかあります。
コードの任意のポイントでスタックトレースを生成する場合(そしてLeopardを使用している場合)は、backtraceのマニュアルページを参照してください。Leopardの前は、実際にはコールスタック自体を掘り下げる必要がありました。
これはほとんど何をすべきかを教えてくれます。
基本的に、アプリケーションの例外処理をログに記録するように設定する必要があります。
#import <ExceptionHandling/NSExceptionHandler.h>
[[NSExceptionHandler defaultExceptionHandler]
setExceptionHandlingMask: NSLogUncaughtExceptionMask |
NSLogUncaughtSystemExceptionMask |
NSLogUncaughtRuntimeErrorMask]
例外の場合、例外のuserInfo辞書のNSStackTraceKeyメンバーを使用してこれを行うことができます。AppleのWebサイトで、例外に対するプログラムの応答の制御を参照してください。
backtrace
およびbacktrace_symbols
関数を使用します。backtrace(3)のマンページを参照してください。