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 上),请参阅 backtrace 手册页。在 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 网站上的控制程序对异常的响应。

于 2008-10-20T22:44:29.393 回答
1

以这种方式快速打印:

print("stack trace:\(Thread.callStackSymbols)")
于 2018-11-12T13:57:20.473 回答
-1

如果你想得到它作为 NSString。

[NSThread  callStackSymbols].description
于 2021-11-09T07:39:13.943 回答