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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

Hey activa - для получения дополнительной информации об исключениях времени выполнения вы должны иметь возможность открыть консоль отладчика и просмотреть дополнительную информацию. Я предполагаю, что вы уже это сделали, но на всякий случай - вы можете добраться до него, выбрав "Пуск" → "Консоль" в меню. Я не уверен, почему он не появляется автоматически!

Ответ 4

Вы можете обернуть свой 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