Xcode 4.2/IOS 5下控制台中的堆栈跟踪没有异常吗?

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;
}


料青山看我应如是
浏览 615回答 3
3回答

肥皂起泡泡

这样做是可行的: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不能工作。但是,显然这个问题只影响模拟器。最新情况:已经指出,如果您转到Product->Scheme->Edit Scheme,选择“run(Debug)”,选择“Diagnotics”选项卡,然后单击“LogExceptions”,这将恢复缺少的Xcode默认异常日志记录,可能(我还没有尝试过)消除了上述攻击的需要。

侃侃尔雅

这是一个已知的问题.。关于解决办法,请参阅这里和这里.另一种选择可能是defaults write NSGlobalDomain NSExceptionHandlingMask 63虽然它通常用于OSX,但在使用模拟器时可能会有所帮助-但我现在无法尝试它:-(

心有法竹

我有同样的问题,打开“拇指编译”回到我的工作。注意:出于明显的原因,我只为调试配置打开了它。
打开App,查看更多内容
随时随地看视频慕课网APP