Приложение для iPad аварийно завершает работу только в дистрибутивной сборке 4.2

У меня странная проблема, надеюсь, кто-то может пролить свет.

У меня есть приложение для iPad в AppStore, которое было выпущено, когда 3.2 была единственной доступной iOS для iPad. Приложение работало нормально на этой iOS, но как только вышла версия 4.2.1 для ipad, и поэтому некоторые из моих пользователей обновились до новой iOS, приложение теперь аварийно завершает работу при нажатии определенного элемента UIBarButtonItem. В промежутке от iOS 3.2 до выхода iOS 4.2.1 я не отправлял никаких обновлений, поэтому это было одно и то же приложение, работающее на каждой iOS, но у меня была эта проблема только на 4.2.

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

while(i < [filteredData count]) {

вот и все!!... просто простая проверка в цикле while. Последняя вещь в журнале сбоев указывает на приведенную выше строку кода....

filteredData — это NSMutableArray, который определенно выделен/инициализирован в этот момент. Он фактически используется в другом фрагменте кода до этого без проблем. Опять же, эта строка кода не вызвала у моего приложения проблем на iOS 3.2, но на iOS 4.2.1 она вызывает EXC_BAD_ACCESS (SIGSEGV)

Когда я устанавливаю приложение на свое устройство через xcode с конфигурацией отладки или выпуска, оно работает отлично, но при установке из AppStore (сборка дистрибутива) оно вылетает и только на 4.2!

Просто для ясности.....

приложение отлично работает в режимах отладки и распространения на 3.2

приложение отлично работает в режиме отладки на 4.2, НО приложение вылетает в режиме распространения на 4.2

Есть предположения? .....потому что я запутался/потерял Спасибо, что нашли время


person freddyD    schedule 08.12.2010    source источник
comment
Когда вы переходите к сборке информации о вашей цели, какие различия существуют между конфигурациями дистрибутива и отладки? (Способ узнать, есть ли разница в каком-либо поле, — это выбрать «Все конфигурации», затем прокрутить вниз и найти «Несколько значений» или тире напротив галочки.)   -  person Sam Ritchie    schedule 08.12.2010
comment
есть ожидаемые различия путей (отладка-iphoneos против дистрибутива-iphoneos). Validate собранный продукт проверяется при распространении, а не при отладке. Настройка символов отладки полосы во время копирования проверяется при распространении, но не при отладке. Уровень оптимизации отсутствует при отладке, самый быстрый, минимальный при распространении. Другие флаги C и C++ пусты при отладке, но при распространении они -DNS_BLOCK_ASSERTIONS=1.   -  person freddyD    schedule 09.12.2010


Ответы (1)


Возможно, это вызвано оптимизацией, выполненной компилятором в сборках Release, тем более что вы не получаете проблему в Debug.

Можете ли вы провести рефакторинг, чтобы...

NSUInteger count = [filteredData count];
while(i < count) {

Или filteredData мутирует в цикле?

NSUInteger count = [filteredData count];
while(i < count) {
   blah;
   blah;
   count = [filteredData count];
}
person Warren Burton    schedule 08.12.2010
comment
да, рефакторинг здесь вообще не проблема. Проблема в том, как я могу проверить, помогло это или нет?? Как уже упоминалось, это происходит только в сборке дистрибутива, так как я могу проверить? Как вы, возможно, знаете, процесс утверждения в AppStore не самый быстрый, поэтому на его сужение уйдут недели и недели… не говоря уже о том, что я раздражаю своих пользователей, потому что они будут продолжать получать обновления без каких-либо исправлений. - person freddyD; 09.12.2010
comment
Нет, просто перестройте как режим выпуска, но подпишите свой сертификат разработчика. Видеть это. stackoverflow.com/ вопросов/4288964/ Это докажет, виноват ли уровень оптимизации. Вы хотите изменить уровень оптимизации на самый быстрый + самый маленький в ваших целевых настройках - person Warren Burton; 09.12.2010
comment
хм.. да, похоже, это проблема оптимизации. Изменение уровня действительно показывает сбой, что является отличной причиной, потому что теперь я действительно вижу, как это происходит, и исправляю это. Странно то, что строка/строки кода, вызывающие сбой, находятся внутри цикла while... даже если цикл не введен! По крайней мере, теперь я это вижу... спасибо!! - person freddyD; 12.12.2010
comment
это странно .... когда я строю в режиме выпуска, уровень опто уже установлен на самый быстрый + самый маленький, и он НЕ сбой. Когда я строю в режиме отладки и просто меняю опто-уровень на самый быстрый + наименьший (от нуля), происходит сбой. Я думаю, что исправил свою проблему, но просто любопытно... не является ли сборка дистрибутива клоном сборки выпуска? Тем не менее, он падает при распространении, не падает при выпуске и падает при отладке с поднятым уровнем опто! Я просто не вижу там закономерности. В любом случае спасибо за помощь! - person freddyD; 12.12.2010