NSZombies включен, отладочная информация - PullRequest
0 голосов
/ 07 февраля 2012

Мое приложение Mac падает с exc_bad_access в циклах выполнения. Поэтому я включил NSZombies, и теперь я не вижу такой ошибки, как ожидалось (поскольку объекты не выделены).

Но я не нашел в консоли полезного журнала NSZombie. Есть ли способ определить проблему?

Ответы [ 2 ]

3 голосов
/ 07 февраля 2012

Это сложно. Наиболее распространенной причиной этой ошибки в Какао является прямой доступ к вашим иварам, а не использование средств доступа. Средства доступа устраняют подавляющее большинство сбоев памяти.

Тем не менее, они не единственная причина ошибок памяти. Вы можете получить доступ к памяти другими способами. NSZombie делает одну конкретную вещь: когда вы освобождаете объект, NSZombie говорит: «на самом деле не освобождайте объект». Вместо этого он превращает объект в объект зомби, который печатает сообщение об ошибке, если вы отправляете ему сообщения. Но это помогает, только если сбой происходит из-за отправки сообщения в освобожденный экземпляр. Это может быть много других вещей.

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

Чтение TN2124 , в частности, раздел, посвященный распределителю памяти BSD, и раздел , включающий функции отладки Malloc в Руководстве по производительности при использовании памяти. Существуют инструменты более низкого уровня, чем NSZombie, которые вы можете использовать. MallocScribble часто является наиболее полезным. Он перезаписывает освобожденную память с 0x55, так что вы с большей вероятностью вылетите раньше и упростит обнаружение освобожденной памяти в отладчике. MallocPreScribble полезен для поиска неинициализированной памяти, но это действительно помогает, только если вы делаете необработанные malloc вызовы. Объекты ObjC всегда предварительно инициализируются.

И, конечно, вы должны надеть свою детективную шляпу. Какие части вашей программы наиболее подозрительны? Вы выполняете многопоточную работу (это может привести к сбоям памяти, если вы не правильно заблокировали).

Если он легко воспроизводится, тогда вы поймете это. Если это случается иногда, хорошо ... Иногда я охотился на таких жуков много месяцев. Иногда это просто тяжело.

0 голосов
/ 07 февраля 2012

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

...