Xcode 4.2/IOS 5下控制台中的堆栈跟踪没有异常吗?在Xcode 3.x和IOS 4下,如果在模拟器中发出未处理异常信号,控制台输出中会产生异常堆栈跟踪(类似于Java)。当我在Xcode 4.2下的IOS 5中引发一个未处理的异常,运行完全相同的应用程序代码时,堆栈跟踪不会发生。(我确实知道了如何设置异常断点,但这不会在控制台中产生回溯。)这仅仅是我需要在某个地方创建的Xcode设置,还是Xcode 4/IOS 5的“特性”?有什么办法恢复这个功能吗?更新不幸的是,添加一个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];
}(原来它已经存在了,所以我只是添加了堆栈跟踪。)这里是启用它的地方(仅在声明处理程序的下面几行):- (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;我设置断点以使我能够检查两个检索到的处理程序值。第一个地址是零,第二个地址是明显有效的地址。但是当抛出测试异常时,处理程序(在iOS 5模拟器中)永远得不到控制。(不过,当我在iOS 4.2模拟器上运行时,它确实得到了控制。)设置NSExceptionHandlingMask显然在iPhone上是不可能的。预qExceptionHandling.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;
}
3 回答
肥皂起泡泡
TA贡献1829条经验 获得超6个赞
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; }
int main(int argc, char *argv[]) { int retVal = -1; @autoreleasepool { @try { retVal = UIApplicationMain(argc, argv, nil, nil); } @catch (NSException* exception) { NSLog(@"Uncaught exception: %@", exception.description); NSLog(@"Stack trace: %@", [exception callStackSymbols]); } } return retVal; }
最新情况:
- 3 回答
- 0 关注
- 614 浏览
添加回答
举报
0/150
提交
取消