首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Xcode 4.2/iOS 5下控制台无异常堆栈跟踪?

Xcode 4.2/iOS 5下控制台无异常堆栈跟踪?
EN

Stack Overflow用户
提问于 2011-11-12 05:13:54
回答 3查看 19.5K关注 0票数 48

在Xcode3.x和Java4中,如果在模拟器中通知了一个未处理的异常,那么控制台输出中会产生一个异常堆栈跟踪(类似于iOS )。

当我在Xcode4.2下的iOS 5中引发一个未处理的异常,运行完全相同的应用程序代码时,堆栈跟踪不会发生。(我确实知道如何设置异常断点,但这不会在控制台中产生回溯。)

这仅仅是我需要在某个地方进行的Xcode设置,还是Xcode4/iOS 5的一个“特性”?有没有办法恢复这一点功能?

更新

不幸的是,添加uncaughtExceptionHandler不起作用。下面是处理程序:

代码语言:javascript
复制
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];
}                                               

(事实证明它已经存在了,为了做一些乱七八糟的事情,所以我只是添加了堆栈跟踪。)

这里是它被启用的地方(就在声明处理程序的地方下面的几行):

代码语言:javascript
复制
- (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

这是可行的:

代码语言:javascript
复制
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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-05 01:18:52

这是可行的:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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默认异常记录,可能(我还没有尝试过),消除上述黑客的需要。

票数 36
EN

Stack Overflow用户

发布于 2011-11-14 21:03:57

这是一个已知的问题。有关解决方法,请参阅herehere

另一种选择可能是

代码语言:javascript
复制
defaults write NSGlobalDomain NSExceptionHandlingMask 63

虽然它通常是针对OSX的,但在使用仿真器时可能会有所帮助-我现在不能尝试它:-(

票数 2
EN

Stack Overflow用户

发布于 2012-01-26 05:45:46

我也遇到了同样的问题,重新打开“针对Thumb的编译”对我来说很有效。注意:出于显而易见的原因,我只是在Debug配置中重新打开了它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8100054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档