我想在某些时间点记录调用跟踪,例如失败的断言或未捕获的异常。
此代码适用于任何线程:
NSLog(@"%@", NSThread.callStackSymbols);
返回一个包含调用堆栈符号的数组。每个元素都是一个 NSString 对象,其值的格式由 backtrace_symbols() 函数确定。
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 提供了一些 sample code。
如果您想在代码中的任意点生成堆栈跟踪(并且您在 Leopard 上),请参阅 backtrace 手册页。在 Leopard 之前,您实际上必须挖掘调用堆栈本身。
This 几乎告诉您该怎么做。
本质上,您需要设置应用程序异常处理以记录,例如:
#import <ExceptionHandling/NSExceptionHandler.h>
[[NSExceptionHandler defaultExceptionHandler]
setExceptionHandlingMask: NSLogUncaughtExceptionMask |
NSLogUncaughtSystemExceptionMask |
NSLogUncaughtRuntimeErrorMask]
对于异常,您可以使用异常的 userInfo 字典的 NSStackTraceKey 成员来执行此操作。请参阅 Apple 网站上的 Controlling a Program's Response to Exceptions。
以这种方式快速打印:
print("stack trace:\(Thread.callStackSymbols)")
如果你想得到它作为 NSString。
[NSThread callStackSymbols].description
backtrace
和backtrace_symbols
函数;请参阅 backtrace(3) 联机帮助页。backtrace/backtrace_symbols
[NSThread.callStackSymbols subarrayWithRange:NSMakeRange(0, MIN(6, NSThread.callStackSymbols.count))];