NSRangeException: стек вызовов не показывает номер строки - PullRequest
9 голосов
/ 23 ноября 2011

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

*** Terminating app due to uncaught exception 'NSRangeException', reason: 
'*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'
*** First throw call stack:
(0x2263052 0x24c7d0a 0x224fdb8 0x2f4a7 0x2264ec9 0x81e299 0x81e306 0x75aa30 
0x75ac56 0x741384 0x734aa9 0x39a9fa9 0x22371c5 0x219c022 0x219a90a 0x2199db4 
0x2199ccb 0x39a8879 0x39a893e 0x732a9b 0x1e5b 0x1dc5 0x1)

Я точно знаю, что означает ошибка, но я считаю, что эти ошибки очень трудно исправить, потому что по какой-то причине стек вызовов неговорит мне строку кода, где вызывается массив.Вот стек вызовов из потока 1:

#0  0x9706d9c6 in __pthread_kill ()
#1  0x93e2cf78 in pthread_kill ()
#2  0x93e1dbdd in abort ()
#3  0x02859e78 in dyld_stub__Unwind_DeleteException ()
#4  0x0285789e in default_terminate() ()
#5  0x024c7f4b in _objc_terminate ()
#6  0x028578de in safe_handler_caller(void (*)()) ()
#7  0x02857946 in __cxa_bad_typeid ()
#8  0x02858b3e in __cxa_current_exception_type ()
#9  0x024c7e49 in objc_exception_rethrow ()
#10 0x02199e10 in CFRunLoopRunSpecific ()
#11 0x02199ccb in CFRunLoopRunInMode ()
#12 0x039a8879 in GSEventRunModal ()
#13 0x039a893e in GSEventRun ()
#14 0x00732a9b in UIApplicationMain ()
#15 0x00001e5b in main

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

Как можно увидеть поток "первого стека вызовов" из ошибки (тот, который имеет 22 адреса), поэтому я могу найти строку, вызывающуюэта ошибка?Возможно, в моих настройках сборки что-то неправильно установлено, из-за чего соответствующий стек не может быть извлечен?

Если бы кто-то мог указать мне правильное направление, я был бы очень благодарен.Попытка найти оскорбительную строку вручную довольно утомительна.

Спасибо!

Ответы [ 3 ]

17 голосов
/ 23 ноября 2011

включите отладчик и установите точку останова всякий раз, когда генерируется исключение, таким образом вы точно знаете, какая строка кода является рывком.];

Посмотрите на следующий вопрос: Добавьте точку останова к objc-exception-throw

2 голосов
/ 23 ноября 2011

Вы включили глобальные точки останова в своем проекте?Если нет, добавьте objc_exception_throw в раздел точек останова в навигаторе проекта, затем перезапустите приложение, вы должны получить стек.Кроме того, когда происходит сбой, наблюдайте и расширяйте любые дополнительные потоки, чтобы увидеть их стеки.Несколько раз со мной случалось, что стек, который я искал, находился в фоновом потоке, хотя основной поток сообщал о сбое.НТН.

0 голосов
/ 05 февраля 2015

Предполагая, что это произошло в отладчике XCode, вы можете определить строку кода, на которую ссылаются адреса трассировки.В окне отладки введите следующее:

list * address from traceback

Например, для первой записи вы должны ввести следующее: list * 0x2263052

Doэто для каждого адреса.Один из них должен указывать на код вашей программы и перечислять номер и код ошибочной строки выше и ниже ошибочной строки.

-Steve

...