Трассировка стека или дополнительная информация о необработанном исключении в Xcode/iPhone
Извините за мое невежество, но что-то беспокоит меня об отладчике Xcode при запуске приложений iPhone в iPhone Simulator.
Иногда, когда я что-то путаю в Интерфейсном Разработчике, я получаю необработанное исключение во время выполнения и возвращаюсь в XCode. Единственное, что я вижу, - это единственная строка "неисследованное исключение" или что-то в этом роде. Из того, что я вижу, нет никакой дополнительной информации, не говоря уже о трассировке стека или о чем-либо еще, что полезно.
Я разрабатывал в Visual Studio последние десять лет или около того, и я привык получать хорошую трассировку стека и полную информацию об исключениях, когда что-то подобное происходит.
Я уверен, что я просто упускаю что-то очень очевидное... Надеюсь...
4 ответа
Если вы добавите две точки останова, вы сможете отладить эти исключения. Для этого перейдите в Run | Показать | Точки останова и создание двух глобальных точек останова (я делаю их глобально, потому что они так полезны во всех моих приложениях). Первый должен называться "objc_exception_throw", а его местоположение должно быть "libobjc.A.dylib". Второй должен быть "-[NSException повышение]" и его местоположение должно быть "CoreFoundation".
Теперь, если вы начнете отлаживать ваше приложение с включенными точками останова, оно должно сработать при возникновении этих исключений. После этого вы сможете увидеть цепочку событий, которые привели к исключению в отладчике.
Отсутствие трассировки стека обычно указывает на проблему с LLDB (отладчик). Я люблю LLDB, но когда дело доходит до показа трассировки стека и разбивки на исключения, а не на основные в приложениях для iOS, это боль в заднице, и это было уже несколько релизов. Понятия не имею, почему Apple еще не обратилась к этому. Чтобы исправить это двухэтапный процесс:
- Отредактируйте свою текущую схему и на вкладке "Выполнить" измените отладчик с LLDB на GDB.
- Перейдите на 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