Как лучше всего отладить сбой в objc_msgSend?
У меня произошел сбой при стоке NSAutoreleasePool
. Предположительно пул пытается освободить объект, который был преждевременно выпущен другим фрагментом кода. Сбой, который у меня есть, находится в середине objc_msgSend
, поскольку он пытается отправить сообщение объекту, который больше не существует.
Учитывая состояние стека, какие команды tips/tricks/processes/ gdb
у меня имеются в моем распоряжении для получения информации об рассматриваемом объекте и/или о точке, в которой произошло незаконное освобождение?
Ответы
Ответ 1
Если у вас есть подозрение, что это преждевременное удаление, включите зомби, чтобы подтвердить свою гипотезу, а затем отладить, что происходит. Когда вы включаете зомби, объекты на самом деле не уничтожаются, а устанавливаются в состояние зомби, что помогает вам обнаруживать, когда они обращаются после вызова dealloc. Подробнее от NSZombieEnabled
Ответ 2
Окончательная статья об этом виде сбоев: http://www.sealiesoftware.com/blog/archive/2008/09/22/objc_explain_So_you_crashed_in_objc_msgSend.html
Ответ 3
Если вы используете NSZombieEnabled, вы можете хотя бы выяснить, какой класс является объектом.
Ответ 4
Я столкнулся с тем, что, похоже, произошло сбой в objc_msgSend
. То, что было еще страннее, было application:didFinishLaunchingWithOptions:
даже не достигнуто до того, как произошел так называемый крах!
В моем случае авария оказалась точкой останова, которую я случайно включил в адрес памяти, который вызывался до того, как был достигнут какой-либо из моих кодов.
![enter image description here]()
Спустя час или около того, пытаясь понять это, я снял контрольную точку, запустил код, поднял лицо, а затем продолжил свой день, делая вид, что этого никогда не было...