Трассировка стека или дополнительная информация о необработанном исключении в Xcode/iPhone

Извините за мое невежество, но что-то беспокоит меня об отладчике Xcode при запуске приложений iPhone в iPhone Simulator.

Иногда, когда я что-то путаю в Интерфейсном Разработчике, я получаю необработанное исключение во время выполнения и возвращаюсь в XCode. Единственное, что я вижу, - это единственная строка "неисследованное исключение" или что-то в этом роде. Из того, что я вижу, нет никакой дополнительной информации, не говоря уже о трассировке стека или о чем-либо еще, что полезно.

Я разрабатывал в Visual Studio последние десять лет или около того, и я привык получать хорошую трассировку стека и полную информацию об исключениях, когда что-то подобное происходит.

Я уверен, что я просто упускаю что-то очень очевидное... Надеюсь...

4 ответа

Решение

Если вы добавите две точки останова, вы сможете отладить эти исключения. Для этого перейдите в Run | Показать | Точки останова и создание двух глобальных точек останова (я делаю их глобально, потому что они так полезны во всех моих приложениях). Первый должен называться "objc_exception_throw", а его местоположение должно быть "libobjc.A.dylib". Второй должен быть "-[NSException повышение]" и его местоположение должно быть "CoreFoundation".

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

Отсутствие трассировки стека обычно указывает на проблему с LLDB (отладчик). Я люблю LLDB, но когда дело доходит до показа трассировки стека и разбивки на исключения, а не на основные в приложениях для iOS, это боль в заднице, и это было уже несколько релизов. Понятия не имею, почему Apple еще не обратилась к этому. Чтобы исправить это двухэтапный процесс:

  1. Отредактируйте свою текущую схему и на вкладке "Выполнить" измените отладчик с LLDB на GDB.
  2. Перейдите на https://developer.apple.com/bugreporter/ и сообщите об ошибке, чтобы Apple исправила ее.

Эй, activa - для получения дополнительной информации об исключениях во время выполнения, вы должны иметь возможность открыть консоль отладчика и увидеть больше информации. Я предполагаю, что вы уже сделали это, но на всякий случай - вы можете добраться до него, выбрав в меню Run -> Console. Я не уверен, почему это не происходит автоматически!

Вы можете обернуть ваш UIApplicationMain в try/catch:

int main(int argc, char *argv[]) {
    int retVal;
    NSAutoreleasePool * pool;
    @try
    {
    pool = [[NSAutoreleasePool alloc] init];
    retVal = UIApplicationMain(argc, argv, nil, nil);
    }
    @catch(NSException* e)
    {
        NSLog(@"%@", e.reason);
    }
    @finally
    {
    [pool release];
    }
    return retVal;
}

Вы также должны посмотреть на установку обработчика утверждений во время отладки: NSAssertionHandler.

Обновление: а также обработчик необработанных исключений: NSSetUncaughtExceptionHandler

Другие вопросы по тегам