我希望在某些点,如失败的断言或未捕获的异常时记录调用跟踪。
我希望在某些点,如失败的断言或未捕获的异常时记录调用跟踪。
这段代码可在任何线程上运行:
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);
。 - Corentin S.Cocoa已经可以将未捕获异常的堆栈跟踪记录到控制台中,尽管它们只是原始的内存地址。如果您想在控制台中获取符号信息,可以参考苹果公司提供的示例代码。
如果您想在代码的任意点生成堆栈跟踪(且使用Leopard操作系统),请查看backtrace man页面。在Leopard之前,您实际上必须深入调用堆栈本身进行研究。
void* callstack[128];
int i, frames = backtrace(callstack, 128);
char** strs = backtrace_symbols(callstack, frames);
for (i = 0; i < frames; ++i) {
printf("%s\n", strs[i]);
}
free(strs);
- mharper这篇文章基本上告诉你该怎么做。
实质上,你需要设置应用程序的异常处理来进行日志记录,例如:
#import <ExceptionHandling/NSExceptionHandler.h>
[[NSExceptionHandler defaultExceptionHandler]
setExceptionHandlingMask: NSLogUncaughtExceptionMask |
NSLogUncaughtSystemExceptionMask |
NSLogUncaughtRuntimeErrorMask]
对于异常情况,您可以使用异常的userInfo字典中的NSStackTraceKey成员来实现此操作。请参见Apple网站上的控制程序对异常的响应。
用 Swift 这样打印:
print("stack trace:\(Thread.callStackSymbols)")
如果你想将它作为NSString返回。
[NSThread callStackSymbols].description
backtrace
和backtrace_symbols
函数;请参阅 backtrace(3) 手册页面。 - Peter Hoseybacktrace/backtrace_symbols
。 - dymv[NSThread.callStackSymbols subarrayWithRange:NSMakeRange(0, MIN(6, NSThread.callStackSymbols.count))];
。 - Albert Renshaw