"Программа получила сигнал: EXC_BAD_ACCESS" - как определить линию, где это было запущено? - PullRequest
4 голосов
/ 28 февраля 2011

Как мне легче всего найти точку в моем коде, где это (то есть "Программа получила сигнал: EXC_BAD_ACCESS") запускается?

Когда я получаю это и смотрю в консоли, я не вижу никакой дополнительной информации, такой как трассировка стека в этом случае.Я знаю, что могу поставить точки останова через код и попытаться пошагово пройти, чтобы найти, однако, если есть способ легче найти без множества точек останова и пройти через это было бы здорово.набирая backtrace (повторяю этот ответ), я вижу это, что, кажется, не особо выделяет точку в моем коде?

(gdb) backtrace
#0  0x00fd7a63 in objc_msgSend ()
#1  0x06019780 in ?? ()
#2  0x0046cf16 in -[UISectionRowData refreshWithSection:tableView:tableViewRowData:] ()
#3  0x0046a9e7 in -[UITableViewRowData numberOfRows] ()
#4  0x003218c2 in -[UITableView noteNumberOfRowsChanged] ()
#5  0x0032e2b8 in -[UITableView reloadData] ()
#6  0x0032b470 in -[UITableView layoutSubviews] ()
#7  0x01d33451 in -[CALayer layoutSublayers] ()
#8  0x01d3317c in CALayerLayoutIfNeeded ()
#9  0x01d2c37c in CA::Context::commit_transaction ()
#10 0x01d2c0d0 in CA::Transaction::commit ()
#11 0x01d5c7d5 in CA::Transaction::observer_callback ()
#12 0x00e56fbb in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ ()
#13 0x00dec0e7 in __CFRunLoopDoObservers ()
#14 0x00db4bd7 in __CFRunLoopRun ()
#15 0x00db4240 in CFRunLoopRunSpecific ()
#16 0x00db4161 in CFRunLoopRunInMode ()
#17 0x017aa268 in GSEventRunModal ()
#18 0x017aa32d in GSEventRun ()
#19 0x002c342e in UIApplicationMain ()

Ответы [ 4 ]

5 голосов
/ 28 февраля 2011

NSZombieEnabled, скорее всего, поможет вам найти большинство перевыпущенных ошибок.От CocoaDev :

Использование в Xcode: Дважды щелкните исполняемый файл в группе «Исполняемые файлы» вашего проекта XCode.Перейдите на вкладку «Аргументы».В разделе «Переменные для установки в среде:» создайте переменную с именем «NSZombieEnabled» и установите для нее значение «ДА».

Для особо неприятных случаев (неприятная ошибка из-за чрезмерного автоматического выпуска)в моем случае) некоторые дополнительные флаги, такие как NSDebugEnabled, MallocStackLogging и MallocStackLoggingNoCompact, помогут вам изучить историю сохранения / выпуска для любой переменной.Учебное пособие по их использованию можно найти здесь http://www.cocoadev.com/index.pl?DebuggingAutorelease

4 голосов
/ 28 февраля 2011

Попробуйте использовать NSZombies в инструментах.Есть видео Apple WWDC о том, как его использовать.Это должно помочь вам определить, откуда оно исходит.

2 голосов
/ 28 февраля 2011

Используйте команду GDB backtrace (введите в консоли «backtrace»). Это распечатает весь стек до сбоя.

Подробнее здесь.

1 голос
/ 28 февраля 2011

Есть несколько вещей, которые вы можете сделать, чтобы решить проблемы с памятью трассировки.

  1. В некоторых случаях вы можете использовать отладчик. Команда + Shift + Y

  2. Вы можете использовать NSZombieEnabled.

  3. Вы можете использовать «Построить и проанализировать» из меню Build.

...