在Xcode 4.2 / iOS 5下的控制台中没有exceptionstacktrace?
在Xcode 3.x和iOS 4下,如果在模拟器中发出未处理的exception,则会在控制台输出中生成exception堆栈跟踪(类似于Java)。
当我在Xcode 4.2下的iOS 5中引发一个未处理的exception,运行完全相同的应用程序代码时,堆栈跟踪不会发生。 (我弄清楚如何设置一个exception断点,但是不会在控制台中产生回溯。)
这只是一个Xcode设置,我需要做的地方,或Xcode 4 / iOS 5的“function”? 有没有办法恢复这一点的function?
更新
不幸的是,添加一个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]; }
(事实certificate,它已经存在,做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;
我设置了断点,使我能够检查两个检索到的处理程序值。 第一个是零,第二个是明显有效的地址。 但是当testingexception被抛出时,处理程序(在iOS 5模拟器中)永远不能控制。 (虽然当我在iOS 4.2模拟器上运行时,它确实得到了控制。)
设置NSExceptionHandlingMask
显然是不可能在iPhone上。 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; }
这工作:
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不起作用。 但是,显然这个问题只影响模拟器。
更新:
有人指出,如果你去产品 – >计划 – >编辑计划,select“运行(debugging)”,select“诊断”选项卡,然后单击“loggingexception”,这将恢复丢失的Xcode默认exceptionlogging,可能(我还没有尝试过)消除了上面的黑客的需要。
这是一个已知的问题…解决方法请参阅这里和这里 。
另一种select可能是
defaults write NSGlobalDomain NSExceptionHandlingMask 63
尽pipe通常用于OSX,但在使用模拟器时可能会有所帮助 – 现在我无法尝试:—(
我有同样的问题,把'编译为拇指'回来为我工作。 注意:由于显而易见的原因,我只打开了Debugconfiguration。