300

失敗したアサーションやキャッチされていない例外など、特定の時点でコール トレースをログに記録したいと考えています。

4

7 に答える 7

557

このコードはどのスレッドでも機能します。

NSLog(@"%@", NSThread.callStackSymbols);

コール スタック シンボルを含む配列を返します。各要素はNSString、関数によって決定される形式の値を持つオブジェクトbacktrace_symbols()です。

于 2010-02-24T00:42:15.040 に答える
35

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;
    }
}
于 2013-01-09T05:13:31.803 に答える
9

Cocoaは、キャッチされていない例外のスタックトレースを、単なる生のメモリアドレスですが、コンソールにすでに記録しています。コンソールに記号情報が必要な場合は、Appleのサンプルコードがいくつかあります。

コード内の任意のポイントでスタックトレースを生成する場合(およびLeopardを使用している場合)は、バックトレースのマニュアルページを参照してください。Leopardの前は、実際にはコールスタック自体を掘り下げる必要がありました。

于 2008-10-20T22:58:59.770 に答える
6

これは、何をすべきかをほとんど示しています。

基本的に、ログに記録するアプリケーションの例外処理を設定する必要があります。たとえば、次のようになります。

#import <ExceptionHandling/NSExceptionHandler.h>

[[NSExceptionHandler defaultExceptionHandler] 
                  setExceptionHandlingMask: NSLogUncaughtExceptionMask | 
                                            NSLogUncaughtSystemExceptionMask | 
                                            NSLogUncaughtRuntimeErrorMask]
于 2008-10-20T22:28:52.560 に答える
2

例外の場合、例外の userInfo ディクショナリの NSStackTraceKey メンバーを使用してこれを行うことができます。Apple の Web サイトで、例外に対するプログラムの応答の制御を参照してください。

于 2008-10-20T22:44:29.393 に答える