Objective C - получение номера строки или полной трассировки стека из-за ошибки отладчика?
Можно ли получить номер строки для исходного кода (или что-нибудь, что помогает отлаживать, где проблема) от отладчика, который показывает, откуда возникает проблема?
Я получаю сообщение об ошибке:
-[NSCFArray objectAtIndex:]: index (-1 (or possibly larger)) beyond bounds (9)
что, очевидно, означает, что я выхожу за пределы в какой-либо точке, однако, если это возможно, я хотел бы получить дополнительную информацию, чтобы помочь мне решить проблему.
Я помещаю точку останова и пытаюсь пройти программу за строкой, но это утомительный процесс. Спасибо!
Ответы
Ответ 1
Когда отладчик остановится, перейдите к "Debug Navigator" и убедитесь, что слайдер внизу находится справа.
Сканируйте свой глаз вниз от точки, в которой выбрано исключение, и вы должны в конечном итоге перейти к своему собственному коду. Нажмите на соответствующее имя метода/функции, и код будет открыт в редакторе.
![enter image description here]()
![enter image description here]()
Если вы не видите каких-либо из ваших собственных методов в трассировке стека, исключение может быть передано через вызов performSelector
-style, и в этом случае трассировка стека исчезнет. Если это так, вы можете получить лучшую информацию, добавив точку исключения исключения "On Throw". Сначала переключитесь на "навигатор точки останова":
![enter image description here]()
Затем нажмите на плюс и выберите "Добавить контрольную точку исключения..."
![enter image description here]()
Создайте точку останова "On Throw":
![enter image description here]()
Это остановит отладчик в точном месте, когда будет выбрано исключение, и вы получите лучшую трассировку стека. Это хорошая идея, чтобы время прерывания исключения, подобное этому, постоянно включалось, хотя иногда вы получаете внутренние исключения из кода Apple (например, при использовании QLPreviewController, MPMoviePlayerController).
Ответ 2
Вы также должны рассмотреть возможность использования NSSetUncaughtExceptionHandler.
(Вы можете сохранить журнал сбоя на диск, проверить следующий запуск, если новый журнал сбоев был сохранен, привязать его к электронной почте и т.д.)
поместите это в свой метод didFinishLaunchingWithOptions:
NSSetUncaughtExceptionHandler(&exceptionHandler);
и реализовать обработчик исключений:
void exceptionHandler(NSException *exception)
{
NSLog(@"%@",[exception name]);
NSLog(@"%@",[exception reason]);
NSLog(@"%@",[exception userInfo]);
NSLog(@"%@",[exception callStackSymbols]);
NSLog(@"%@",[exception callStackReturnAddresses]);
}