2009-08-24 2 views
11

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

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

ответ

16

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

+3

Кроме того, вы можете использовать инструмент Alloc инструмента Object 'для отслеживания событий сохранения/освобождения объекта, который был преждевременно выпущен. Проблема не в том, что это проблема с авторефератом, но и в некоторых случаях, как правило, в предварительном порядке. – bbum

+0

@Pang Я только что обновил ссылку. – inga

3

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

+2

В то время как правильный, tequilatango-х ответ дает ответ вместе с некоторыми полезными подробностями. – bbum

+0

Совершенно верно. Я мог бы хотя бы предоставить ссылку на внешнюю информацию. – Wevah

2

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

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

enter image description here

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

Смежные вопросы