Отладка iPhone приложения на телефоне - PullRequest
0 голосов
/ 30 января 2010

Меня ушибла ошибка, которую я просто не могу понять, как отлаживать.По сути, я запускаю свой код на симуляторе, и все в порядке.

Однако, когда я подхожу к реальному устройству, я получаю ошибку EXC_BAD_ACCESS.К сожалению, когда работает на телефоне под отладчиком, проклятая вещь работает просто отлично, поэтому я не могу судить, где происходит ошибка.

Я получил одну трассировку стека, которую не смог воспроизвести, поэтомуЯ почти уверен, что строка в моем коде, которая вызывает проблему, является следующей (но я не могу понять, как это могло быть):

[[NSNotificationCenter defaultCenter] postNotificationName:@"SubscriberChanged" object: nil];

Фактическая ошибкабыл на objc_msgSend примерно на четыре кадра ниже этой строки, но в коде, который, кажется, является частью iPhone SDK, поэтому у меня нет источника для его проверки.

Может кто-нибудь дать мне несколько указателейо том, как я могу выяснить, где эта проблема?У меня есть крайний срок, чтобы отправить эту вещь, и я не могу допустить, чтобы она вышла вот так ...

Мне наконец удалось воспроизвести это в отладчике.Трассировка стека, которую я получаю, выглядит следующим образом:


#0  0x30011940 in objc_msgSend ()
#1  0x3054dc80 in _nsnote_callback ()
#2  0x3024ea58 in _CFXNotificationPostNotification ()
#3  0x3054b85a in -[NSNotificationCenter postNotificationName:object:userInfo:] ()
#4  0x3054dbc0 in -[NSNotificationCenter postNotificationName:object:] ()
#5  0x000027c6 in -[My2CentsAppDelegate handleMOCChange:] (self=0x1159d0, _cmd=0x2bf90, notification=0x147400) at /Users/sdussin/Desktop/UPOD Research LLC/Development/My2Cents/Classes/My2CentsAppDelegate.m:52
#6  0x3054dc80 in _nsnote_callback ()
#7  0x3024ea58 in _CFXNotificationPostNotification ()
#8  0x3054b85a in -[NSNotificationCenter postNotificationName:object:userInfo:] ()

Кадр # 5 в трассировке стека соответствует строке выше.

Ответы [ 5 ]

2 голосов
/ 30 января 2010

Вы можете использовать NSZombieEnabled (Google it), чтобы отслеживать подобные вещи. Кроме этого, я второй: Вам, вероятно, нужно отменить регистрацию какого-либо наблюдателя, например, контроллер представления, который был выгружен, но все еще зарегистрирован как наблюдатель.

2 голосов
/ 30 января 2010

Если вы не можете повторить свой сбой в отладчике, вы можете попробовать другие подходы для его решения:

  • Просмотрите код (возможно, попросите друга или коллегу проверить код)
  • Добавить протоколирование и утверждения
  • Активировать все (или, по крайней мере, большинство) предупреждений компилятора и подчиняться им
  • Обязательно используйте статический анализатор [] clang 2 и следуйте его предупреждениям

Особенно Clang неплохо находит ошибки управления памятью. И EXC_BAD_ACCESS пахнет как один.

Возможно, один из наблюдателей, которых вы зарегистрировали в NSNotificationCenter , был освобожден. Помните,

Важно : Центр уведомлений не удерживает своих наблюдателей, следовательно, вы должны убедиться, что вы отменить регистрацию наблюдателей (используя removeObserver: или removeObserver: name: object :) перед они освобождены. (Если нет, вы получите ошибку во время выполнения, если центр отправляет сообщение освобожденному объект.)

1 голос
/ 30 января 2010

Трассировка тэка сообщает, что объект, зарегистрированный для уведомлений «SubscriberChanged», был освобожден. Самый простой способ решить эту проблему - найти все классы, которые регистрируются для уведомления «SubscriberChanged», и отменить их регистрацию в их методе [dealloc].

1 голос
/ 30 января 2010

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

Посмотрите на все места в вашем коде, где вы подписываетесь, и посмотрите, где вы пропустили отписку (например, вы отменили подписку в dealloc?).

Также, как уже упоминалось, мы NSZombieEnabled = YES, флаг среды, который вы устанавливаете, щелкая правой кнопкой мыши по исполняемому файлу в браузере проекта XCode, и переходя на вкладку Аргументы и добавляя его к переменным среды. Затем просмотрите журнал, когда вы отправляете уведомление, вы увидите сообщение, в котором говорится что-то вроде «сообщение бла отправлено освобожденному экземпляру».

0 голосов
/ 30 января 2010

Обычно, когда возникает случай, когда что-то работает на симуляторе, а не на устройстве или наоборот, причиной является библиотека / фреймворк, который не скомпилирован для процессора, на котором происходит сбой.

В вашем случае у вас будет библиотека / фреймворк ARM, который отлично работает на устройстве, но не работает на симуляторе, работающем на i386. Я бы проверил наследование любого объекта, зарегистрированного для этого уведомления.

...