Трассировка стека или дополнительная информация о необработанном исключении в 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 еще не обратилась к этому. Чтобы исправить это двухэтапный процесс:
Ответ 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