Objective C - получение номера строки или полной трассировки стека из-за ошибки отладчика? - программирование
Подтвердить что ты не робот

Objective C - получение номера строки или полной трассировки стека из-за ошибки отладчика?

Можно ли получить номер строки для исходного кода (или что-нибудь, что помогает отлаживать, где проблема) от отладчика, который показывает, откуда возникает проблема?

Я получаю сообщение об ошибке:

-[NSCFArray objectAtIndex:]: index (-1 (or possibly larger)) beyond bounds (9)

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

Я помещаю точку останова и пытаюсь пройти программу за строкой, но это утомительный процесс. Спасибо!

4b9b3361

Ответ 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]);
}