为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

料青山看我应如是 2019-07-05 14:59:28
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; }
查看完整描述

3 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

这样做是可行的:

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默认异常日志记录,可能(我还没有尝试过)消除了上述攻击的需要。


查看完整回答
反对 回复 2019-07-05
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

这是一个已知的问题.。关于解决办法,请参阅这里这里.

另一种选择可能是

defaults write NSGlobalDomain NSExceptionHandlingMask 63

虽然它通常用于OSX,但在使用模拟器时可能会有所帮助-但我现在无法尝试它:-(


查看完整回答
反对 回复 2019-07-05
?
心有法竹

TA贡献1866条经验 获得超5个赞

我有同样的问题,打开“拇指编译”回到我的工作。注意:出于明显的原因,我只为调试配置打开了它。


查看完整回答
反对 回复 2019-07-05
  • 3 回答
  • 0 关注
  • 614 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信