EXC_BAD_ACCESS на устройстве, но хорошо на симуляторе - PullRequest
3 голосов
/ 27 августа 2010

У меня есть приложение с прокруткой, которое отлично работает на симуляторе, однако при установке на устройстве оно дает мне EXC_BAD_ACCESS, когда я пытаюсь прокрутить одну страницу. Я проверил его с помощью инструментов с выделениями и утечками, но ничего не просочилось и не было сообщений о зомби ... Мне просто любопытно, что может вызвать такую ​​разницу в симуляторе против устройства? Любые способы отладки этого, поскольку мой символизированный журнал сбоев (частично ниже), кажется, не очень символизированы.

Тип исключения: EXC_BAD_ACCESS (SIGBUS)
Коды исключений: KERN_PROTECTION_FAILURE в 0x0000000f
Разбитая нить: 0

Тема 0 Сбой:
0 libobjc.A.dylib 0x0000286e objc_msgSend + 18
1 MyApp 0x00004fee 0x1000 + 16366
2 UIKit 0x000668f4 - [UIViewController view] + 104
3 MyApp 0x00009716 0x1000 + 34582
4 MyApp 0x0000960c 0x1000 + 34316
5 UIKit 0x0001426c - [UIScrollView setContentOffset:] + 344

Спасибо

Ответы [ 3 ]

3 голосов
/ 27 августа 2010

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

Вы уже проверили, что сообщения о зомби не переданы, что было бы моим первым предложением.

Следующее, что нужно сделать, это включить Guard Malloc - и затем прочитать это

http://developer.apple.com/iphone/library/documentation/Performance/Conceptual/ManagingMemory/Articles/MallocDebug.html

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

В статье:

  1. Посмотрите, как установить переменные в GDB
  2. Прочитайте «Обнаружение кучи»Коррупция "секция
2 голосов
/ 27 августа 2010

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

Лучший способ это сделатьпроблема заключается в том, что приложение запускается на устройстве в режиме отладки без точек останова (одна из причин этого заключается в том, чтобы добавить точку останова, а затем удалить ее).Если вы можете воспроизвести неверный доступ таким образом, после воспроизведения вы можете посмотреть в консоли отладчика (cmd + shift + y) и увидите, что программа остановилась в точке останова, а затем перейдите к стеку потоков.чтобы увидеть последний звонок, который ваше приложение совершило и не удалось, возможно, он получил неверный указатель.

1 голос
/ 25 января 2013

Я хотел бы добавить мой случай к обсуждению.Я только что решил проблему, действительно похожую на эту.Он работал на симуляторе, но не на устройстве.Думал, что это проблема с памятью.Это не было.

Оказывается, я забыл return о не пустом методе.Ожидалось, что он вернет значение, но я забыл сделать возврат вообще.Довольно серьезная ошибка, если вы спросите меня, но она без проблем работала в симуляторе (даже когда возврат фактически использовался для хранения переменной и выполнения каких-либо других операций с ней).

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

Надеюсь, это поможет всем, кто столкнулся с этой проблемой!

...