Как лучше всего отладить сбой в objc_msgSend?

У меня произошел сбой при стоке NSAutoreleasePool. Предположительно пул пытается освободить объект, который был преждевременно выпущен другим фрагментом кода. Сбой, который у меня есть, находится в середине objc_msgSend, поскольку он пытается отправить сообщение объекту, который больше не существует.

Учитывая состояние стека, какие команды tips/tricks/processes/ gdb у меня имеются в моем распоряжении для получения информации об рассматриваемом объекте и/или о точке, в которой произошло незаконное освобождение?

Ответ 1

Если у вас есть подозрение, что это преждевременное удаление, включите зомби, чтобы подтвердить свою гипотезу, а затем отладить, что происходит. Когда вы включаете зомби, объекты на самом деле не уничтожаются, а устанавливаются в состояние зомби, что помогает вам обнаруживать, когда они обращаются после вызова dealloc. Подробнее от NSZombieEnabled

Ответ 3

Если вы используете NSZombieEnabled, вы можете хотя бы выяснить, какой класс является объектом.

Ответ 4

Я столкнулся с тем, что, похоже, произошло сбой в objc_msgSend. То, что было еще страннее, было application:didFinishLaunchingWithOptions: даже не достигнуто до того, как произошел так называемый крах!

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

enter image description here

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