我想在某些点记录调用跟踪,比如失败的断言或未捕获的异常。
这基本上告诉你该怎么做。
本质上,你需要设置应用程序异常处理日志,类似于:
#import <ExceptionHandling/NSExceptionHandler.h>
[[NSExceptionHandler defaultExceptionHandler]
setExceptionHandlingMask: NSLogUncaughtExceptionMask |
NSLogUncaughtSystemExceptionMask |
NSLogUncaughtRuntimeErrorMask]
对于异常,你可以使用异常userInfo字典的NSStackTraceKey成员来做这件事。请参阅Apple网站上控制程序对异常的响应。
Cocoa已经将未捕获异常的堆栈跟踪记录到控制台,尽管它们只是原始内存地址。如果你想要控制台的符号信息,有一些来自苹果的示例代码。
如果您想在代码中的任意点生成堆栈跟踪(并且您在Leopard上),请参阅反向跟踪手册页。在使用Leopard之前,您实际上必须挖掘调用堆栈本身。
这段代码适用于任何线程:
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;
}
}
用这种快速印刷方式:
print("stack trace:\(Thread.callStackSymbols)")
如果你想把它作为NSString。
[NSThread callStackSymbols].description
推荐文章
- 我们如何通过程序检测设备运行的iOS版本?
- 如何添加一个触摸事件到一个UIView?
- 如何检测iPhone 5(宽屏设备)?
- 使浮点数只显示小数点后两位
- 如何在Cocoa中将堆栈跟踪输出到控制台/日志?
- UIActivityViewController在ios8 ipad上崩溃
- 如何使用NSURLConnection连接SSL为一个不受信任的证书?
- 如何控制UILabel中的行间距
- UIRefreshControl没有UITableViewController
- UIImageView在设备的启动屏幕中缺少图像
- 为什么苹果推荐使用dispatch_once来实现ARC下的单例模式?
- 在Swift中使用UI_USER_INTERFACE_IDIOM()检测当前设备
- 当应用程序从后台返回时,为什么viewWillAppear不被调用?
- UITableview:如何禁用一些行选择而不是其他
- Core Data vs SQLite 3