在Xcode3.x和Java4中,如果在模拟器中通知了一个未处理的异常,那么控制台输出中会产生一个异常堆栈跟踪(类似于iOS )。
当我在Xcode4.2下的iOS 5中引发一个未处理的异常,运行完全相同的应用程序代码时,堆栈跟踪不会发生。(我确实知道如何设置异常断点,但这不会在控制台中产生回溯。)
这仅仅是我需要在某个地方进行的Xcode设置,还是Xcode4/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;
我设置了断点,使我能够检查检索到的两个处理程序值。第一个是nil,第二个是一个明显有效的地址。但是,当抛出测试异常时,处理程序(在iOS 5模拟器中)永远不会获得控制权。(不过,当我在iOS 4.2模拟器上运行时,它确实得到了控制。)
在iPhone上设置NSExceptionHandlingMask
显然是不可能的。prereq 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;
}
发布于 2012-09-05 01:18:52
这是可行的:
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;
}
对于ARC:
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;
}
还在等待关于为什么默认转储不再工作和/或为什么(更严重的) uncaughtExceptionHandler不工作的某种解释。然而,显然这个问题只影响仿真器。
更新:
有人指出,如果您进入产品->方案->编辑方案,选择“运行(调试)”,选择“诊断”选项卡,然后单击“记录异常”,这将恢复丢失的Xcode默认异常记录,可能(我还没有尝试过),消除上述黑客的需要。
发布于 2011-11-14 21:03:57
发布于 2012-01-26 05:45:46
我也遇到了同样的问题,重新打开“针对Thumb的编译”对我来说很有效。注意:出于显而易见的原因,我只是在Debug配置中重新打开了它。
https://stackoverflow.com/questions/8100054
复制相似问题