在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。