Как лучше всего отладить сбой в objc_msgSend? - PullRequest
11 голосов
/ 25 августа 2009

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

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

Ответы [ 4 ]

16 голосов
/ 25 августа 2009

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

6 голосов
/ 01 июля 2011
3 голосов
/ 25 августа 2009

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

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

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

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

enter image description here

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

...