2009-12-17 1 views
7

компании Apple Developer Reference Library имеет class reference for WebPreferencesiPhone Simulator аварии с WebPreferences в списке потоков

Я искал SO, Dev Форумы и Googled без каких-либо соответствующих результатов.

EXC_BAD_ACCESS сигнал генерируется.

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

РЕДАКТИРОВАТЬ

Это срабатывает, когда коснувшись UITextField, оставляя UITextField или если UITextField устанавливаются как первый ответчик при загрузке вида (нажать на навигационный контроллер).

Непросто воспроизводить. Я могу пойти за сотней циклов запуска приложений/отладки, прежде чем это произойдет снова. И тогда это может произойти 3 раза в 5 запусках.


У меня есть список тем в отладчике, который показывает несколько ссылок на WebPreferences.

alt text http://i50.tinypic.com/27yrd39.png

+0

Бесстыдный удар. Я получаю их тоже, с тем же стеком вызовов. –

ответ

1

Вы находитесь на правильном пути, если используете NSZombie. EXEC_BAD_ACCESS вызван доступом к выпущенным объектам.

Это нормально для EXEC_BAD_ACCESS, чтобы «сбой» в кодах, которые не принадлежат вам. Скорее всего ваш код создал перевыпущенный объект.

Ключевая часть использования NSZombie запускает malloc_history в командной строке.Вы получите стек вызовов, показывающий, откуда произошел перевыпущенный объект. Например: alt text http://static.benford.name/malloc_history.png

На скриншоте показано, как мое приложение разбивается на [NSString stringByTrimmingCharactersInSet:], но это, безусловно, не тот, кто вызвал сбой.

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

В этом случае объект возник из класса [JTServiceHttpRequest requestFinished], в котором я не сохранил объект должным образом.

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

Моя ставка заключается в том, что поведение WebPreferences и UITextField не имеет ничего общего с крушением.

+0

Спасибо, Бентфорд. Я часто использовал 'malloc_history' при отслеживании проблем управления памятью. И я согласен, что это может быть мой код, вызывающий эту проблему. То, что я обнаружил, действительно сбивает с толку, заключается в том, что это происходило с не связанными контроллерами представлений. Мне также остается загадкой, почему в стеке вызовов есть упоминание о «WebPreferences»? У меня сложилось впечатление, что Safari на хосте Mac немного перекрывается с iPhone Simulator, совместно использующим файлы cookie. Возможно, предпочтения тоже перекрываются? – ohhorob

1

Для любых ошибок EXC_BAD_ACCESS, вы, как правило, пытаетесь отправить сообщение отпущенного объекта. BEST способ отслеживания этих действий используется NSZombieEnabled.

Это работает, никогда не выпуская объект, а завершая его как «зомби» и устанавливая внутри него флаг, который говорит, что он обычно был бы выпущен. Таким образом, если вы попытаетесь получить к нему доступ еще раз, он все еще знает, что это было до того, как вы сделали ошибку, и с этой небольшой информацией вы обычно можете отступить, чтобы узнать, в чем проблема.

Это особенно помогает в фоновом режиме, когда отладчик иногда дергает любую полезную информацию.

ОЧЕНЬ ВАЖНО ДЛЯ ЗАМЕЧАНИЯ, однако, необходимо, чтобы 100% убедитесь, что это только в вашем отладочном коде, а не в вашем коде распространения. Поскольку ничто никогда не выпускается, ваше приложение будет течь, течет и течет. Для того, чтобы напомнить мне, чтобы сделать это, я положил этот журнал в моем AppDelegate:

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) 
    NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!"); 

Если вам нужна помощь в поиске точной линии, сделайте сборку-и-Debug (CMD-Y) вместо Build- and-Run (CMD-R). Когда приложение выйдет из строя, отладчик покажет вам, в какой строке и в сочетании с NSZombieEnabled, вы должны точно выяснить, почему.

+0

Спасибо coneybeare, я могу подтвердить, что у меня есть 'NSZombieEnabled',' MallocStackLogging' и 'MallocStackLoggingNoComp' как переменные, установленные в среде при запуске. Я всегда работаю с «Build and Run - Breakpoints On». – ohhorob

+0

Вы должны посмотреть на его стек вызовов, хотя - это не в его коде. –

+0

Большинство ошибок EXEC_BAD_ACCESS происходят в коде, который у вас нет, но почти всегда исходит из кода, который вы пишете. См. Мой ответ для примера. – bentford

0

Дело в том, что он сбой в _integerValueForKey: заставляет меня сильно подозревать, что он рушится на выпущенном NSNumber. Перевыпуск NSNumber может привести к таким странным сбоям, что это почти юмористично. Вот что происходит:

  • Вы создаете NSNumber для целого числа «2»
  • Класс NSNumber кэширует NSNumber
  • Вы над-релиз это
  • кэш Класс NSNumber теперь указывает на плохую память
  • Некоторые совершенно не связаны фрагмент кода создает NSNumber для целого числа «2»
  • класс NSNumber выглядит его в своем кэше, и ....
  • Ba ng

Если вы используете Snow Leopard, нажмите Cmd-Shift-A, чтобы анализатор искал проблемы с управлением памятью. В противном случае, отправляйтесь на охоту за использованием NSNumbers.

0

согласен с предыдущими респондентами о NSZombie. Чаще всего это происходит, когда вы используете свой класс в качестве делегата UITextView (или любого другого класса), а также ссылаетесь на него в переменной IBOutlet. когда вы покидаете свой диспетчер просмотра - он освобождается. но если вы не выпустили переменную IBOutlet в - (void) метод dealloc - UITextView по-прежнему будет отправлять вызовы освобожденному делегату (вашему контроллеру вида).

0

Звучит скорее как ошибка авто-релиза. Возможно, вы выпускаете то, что вы не «владеете», а пул NSAutoRelease работает и пытается очистить то, что уже было выпущено?

Вы отпустили что-то, что вы не «распределили»? Например, вы бы не сделать:

NSString *test = @"testing"; 
[test release]; 

Как это приведет к сбою произойдет, когда бассейн работает и попытки Auto Release освободить NSString.