NSSetUncaughtExceptionHandler无法捕获iPhone上的所有错误

时间:2009-07-14 22:57:58

标签: iphone error-handling crash

我正在使用http://code.google.com/p/google-toolbox-for-mac中的GTMStackTrace。

我需要一种方法来测试最终用户在应用崩溃时向我发送错误。我知道如何将数据发送到我的网站,但问题是如何捕获所有未处理的错误。

我有这段代码:

void exceptionHandler(NSException *exception) {
    NSLog(@"%@", [exception reason]);
    NSLog(@"%@", [exception userInfo]);
    NSLog(@"%@", GTMStackTraceFromException(exception));

    UIAlertView *alert = [[UIAlertView alloc]
                          initWithTitle:NSLocalizedString(@"Error unexpected",@"Info: Can't save record")
                          message:GTMStackTraceFromException(exception) delegate:nil 
                          cancelButtonTitle:NSLocalizedString(@"Ok",@"Button: Ok") otherButtonTitles:nil];
    [alert show];
    [alert release];    
}

int main(int argc, char *argv[]) {
    //For crash report..
    NSSetUncaughtExceptionHandler(&exceptionHandler);
    //Normal code...
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

然而,事情并没有发现很多错误,比如糟糕的发布,糟糕的ACCES等,以及应用程序消失了。我有两个问题,其中不清楚为什么发生,最终用户不知道该说些什么。

(例如,释放两次相同的var不能捕获)

那么,我如何得到所有那些讨厌的错误,以便最终用户简单地向我发送崩溃报告?

2 个答案:

答案 0 :(得分:19)

EXC_BAD_ACCESS不会生成异常,它会生成一个信号(SIGSEGV)。要抓住它,你需要一个信号处理程序。克里斯托弗·阿特兰写了nice explanation如何处理这两种崩溃。请务必同时阅读part 1part 2

答案 1 :(得分:1)

如果有人还在处理这个问题,即使使用SIGSEGV也无法解决问题,请参阅我的帖子...... EXC_BAD_ACCESS automatic handling