在Xcode 3.x和iOS 4下,如果模拟器中发生未处理的异常,控制台输出会产生一个异常堆栈跟踪(类似于Java)。但是,在Xcode 4.2下运行相同的应用程序代码时,当我引发未处理的异常时,堆栈跟踪不会发生。(我确实找到了如何设置异常断点,但这并没有在控制台中产生回溯。)这只是我需要在Xcode中进行的设置,还是Xcode 4/iOS 5的“特性”?有没有办法恢复这个功能?
更新:不幸的是,添加uncaughtExceptionHandler无效。以下是处理程序:
(原来已经存在,为了做Flurry的事情,我只是添加了堆栈跟踪。)
这里是启用它的地方(在处理程序声明的几行下面):
我设置了断点以便检查两个检索到的处理程序值。第一个值为nil,第二个值是一个看似有效的地址。但是当测试异常被抛出时,在iOS 5模拟器中处理程序从未控制。(尽管在运行iOS 4.2模拟器时它确实被控制。)
在iPhone上设置NSExceptionHandlingMask显然是不可能的。先决条件ExceptionHandling.framework不可用。
更新2:
这样可以:
更新:不幸的是,添加uncaughtExceptionHandler无效。以下是处理程序:
void uncaughtExceptionHandler(NSException *exception) {
NSLog(@"uncaughtExceptionHnadler -- Exception %@", [exception description]);
// Because iOS 5 doesn't provide a traceback, provide one here
NSLog(@"Stack trace: %@", [exception callStackSymbols]);
// Let Flurry look at the error
[FlurryAPI logError:@"Uncaught" message:@"Crash!" exception:exception];
}
(原来已经存在,为了做Flurry的事情,我只是添加了堆栈跟踪。)
这里是启用它的地方(在处理程序声明的几行下面):
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Enable uncaught exception handler to dump stack and let Flurry log the exception
NSUncaughtExceptionHandler* hdlr = NSGetUncaughtExceptionHandler();
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
NSUncaughtExceptionHandler* newHdlr = NSGetUncaughtExceptionHandler();
// TODO: Test
NSException* ex = [NSException exceptionWithName:@"AssertionFailure" reason:@"Test" userInfo:nil];
@throw ex;
我设置了断点以便检查两个检索到的处理程序值。第一个值为nil,第二个值是一个看似有效的地址。但是当测试异常被抛出时,在iOS 5模拟器中处理程序从未控制。(尽管在运行iOS 4.2模拟器时它确实被控制。)
在iPhone上设置NSExceptionHandlingMask显然是不可能的。先决条件ExceptionHandling.framework不可用。
更新2:
这样可以:
int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = -1;
@try {
retVal = UIApplicationMain(argc, argv, nil, nil);
}
@catch (NSException* exception) {
NSLog(@"Uncaught exception: %@", exception.description);
NSLog(@"Stack trace: %@", [exception callStackSymbols]);
}
[pool release];
return retVal;
}