Как отладить EXC_BAD_ACCESS в приложении для iPhone, когда я не могу определить причину? - PullRequest
7 голосов
/ 14 апреля 2011

Помогите, я уже несколько недель взломаю это!У меня есть это приложение, которое я разрабатываю в симуляторе, и я сделал много вещей с пользовательским интерфейсом, это только начало интересной части с данными.Это началось сразу после запуска, примерно в 90% времени, когда я его запускаю, это вызовет исключение EXC_BAD_ACCESS.

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

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

Этот отладчик имеет этот стек, но он колеблется при каждом сбое.Непоследовательная природа говорит мне, что есть память, которая автоматически высвобождается, но я понятия не имею, как это выяснить.

0 objc_msgSend
1 ??
2 _CFAutoReleasePoolPop
3 -[NSAutoReleasePool release]
4 _UIApplicationHandleEvent
5 PurpleEventCallback
6 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__
7 __CFRunLoopDoSource1
8 __CFRunLoopRun
9 CFRunLoopRunSpecific
10 CFRunLoopRunInMode
11 -[UIApplication _run]
12 UIApplicationMain
13 main

Еще несколько фактов:

  • Я установил NSZombieEnabled, это не имело значения в выводе консоли
  • Я запускал инструменты, используя профиль Leaks, он не показывал никаких утечек

Ответы [ 2 ]

11 голосов
/ 14 апреля 2011

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

Я добавил три переменные среды.

  • NSZombieEnabled
  • NSAutoreleaseFreedObjectCheckEnabled
  • NSDebugEnabled

все они установлены в ДА

вот ссылка с выбранным мной путем.

http://www.codza.com/how-to-debug-exc_bad_access-on-iphone

если вы используете XCode 4, вы добавите их в раздел «Аргументы» всплывающего окна «Редактировать схемы».

Еще одна вещь, которую следует отметить, - вы должны освобождать или автоматически освобождать объекты, которыевы сохраняете.Вы сохраняете сохранение для следующих объектов:

  • Любой выделенный вами объект [NSObject alloc]
  • Любой объект, полученный с помощью статической новой команды [NSObject new]
  • Любой объект, который вы явно сохраняете [myObject retain]
  • Любая копия объекта [myObject copy]
  • Любое свойство с атрибутом retain или copy @property (retain) NSString * myProperty;

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

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

NSObject *myObject = [incomingObject retain];
// Do something with the object.
[myObject autorelease];
[myObject autorelease]; // This line will end in an error down the line when the object is released past 0, or when the release pool is drained.
myObject = nil;
[myObject release]; // This line will do nothing. no error, no effect.
0 голосов
/ 14 апреля 2011

Наиболее вероятная причина - добавление мусора или уже освобожденного объекта в пул автоматического выпуска - возможно, в этой функции PurpleEventCallback?

...