Как отладить «сообщение, отправленное на освобожденный экземпляр» в Xcode4? - PullRequest
49 голосов
/ 28 ноября 2011

Я нажал ALT + CMD + R и активировал NSZombieEnabled в Аргументы> Переменные окружения. Кроме того, я активировал его в меню «Диагностика»> «Управление памятью»> «Включить объекты-зомби».

Однако, когда я собирал и запускал, в какой-то момент мое приложение зависало, давая мне это бесполезное сообщение в консоли:

*** -[CALayer retainCount]: message sent to deallocated instance 0x656b260

Трассировка стека так же бесполезна. Я переместил ползунок уровня детализации полностью вправо. Тема 1 просто показывает мне это:

screenshot

Все принадлежит системе, и ни одна строка не связана с моим приложением. Очевидно, что NSZombiesEnabled не работает, как в Xcode 3, где он остановился на мертвом объекте.

Есть ли способ выяснить , какой CALayer освобожден слишком рано?

Обновление: поэтому после сборки и запуска еще около 100 раз проблема внезапно исчезла! Это полностью прошло! И самое приятное: я никак не изменил свой код! Между тем я несколько раз чистил папку сборки и проект с помощью команд clean и несколько раз удалял приложение в симуляторе.

Обновление 2: К счастью, проблема снова появилась. И сейчас это кажется настойчивым. К счастью, потому что я предпочитаю найти основную причину, а не раздражать пользователей случайным образом.

Обновление 3: наконец-то нашел его случайно:

startButton = newBttn;

должно было быть:

self.startButton = newBttn;

startButton был сохраняющим свойством, и в -dealloc я его выпустил. Таким образом, он был переиздан, и в большинстве (но не во всех) случаях после того, как представление исчезло, он падал, выдавая странное сообщение CALayer retainCount.

Инструмент Зомби (CMD + I), наконец, указал, что он имеет отношение к кнопке. Просто не знал почему и где.

Clang Static Analyzer не жаловался на этот очевидный сбой.

Ответы [ 2 ]

98 голосов
/ 28 ноября 2011

Если это всплывет снова, вы можете запустить специальный инструмент Zombies.Нажмите Ctrl + I, чтобы профилировать приложение и выбрать инструмент Zombies (вы должны работать на симуляторе).Если вы получили зомби, вы можете отобразить всю историю памяти (каждую сохраняемую / освобожденную) для этого объекта, что очень полезно для отслеживания ошибок.

53 голосов
/ 29 ноября 2011

В дополнение к великому ответу Джеффа;чтобы сделать почти то же самое, но без необходимости открывать инструменты или профилировать приложение, вы можете установить NSZombieEnabled , MallocStackLogging и guard malloc в отладчике.Затем, когда произойдет сбой вашего приложения, введите его в консоли gdb:

(gdb) info malloc-history 0x543216

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

В этой статье содержится дополнительная информация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...