NSSetUncaughtExceptionHandler не ловит все ошибки на iPhone - PullRequest
9 голосов
/ 15 июля 2009

Я использую GTMStackTrace из http://code.google.com/p/google-toolbox-for-mac.

Мне нужен способ протестировать конечного пользователя, чтобы он отправлял мне ошибки при сбое приложения. Я знаю, как отправлять данные на мой сайт, но проблема в том, как отлавливать все необработанные ошибки.

У меня есть этот код:

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

Тем не менее, эта вещь не уловила много ошибок, таких как плохая версия, плохой доступ и т.д., и приложение исчезло. У меня есть 2 проблемы, в которых неясно, почему случилось так, что конечные пользователи не имеют ни малейшего понятия, что сказать.

(например, дважды выпустить один и тот же var не поймать)

Итак, как мне получить ВСЕ эти досадные ошибки, чтобы конечный пользователь просто отправил мне отчет о сбое?

Ответы [ 2 ]

19 голосов
/ 15 июля 2009

EXC_BAD_ACCESS не генерирует исключение, оно генерирует сигнал (SIGSEGV). Чтобы поймать его, вам нужен обработчик сигнала. Кристофер Атлан написал приятное объяснение того, как справляться с обоими видами аварий. Обязательно прочитайте часть 1 и часть 2 .

1 голос
/ 25 апреля 2012

если кто-то все еще имеет дело с этой проблемой и не может решить ее даже с SIGSEGV, см. Мой пост ... EXC_BAD_ACCESS автоматическая обработка

...