приложение работает как отладка, но вылетает при выпуске - PullRequest
5 голосов
/ 25 июля 2010

У меня есть программа, которая отлично работает на устройстве в конфигурации отладки, но не работает как выпуск.У кого-нибудь есть такой опыт, и как мне его исправить?

Thx

Ответы [ 2 ]

15 голосов
/ 30 мая 2012

Я столкнулся с той же проблемой - приложение отлично работало на симуляторе и устройстве в режиме отладки, но ни в режиме выпуска (оно установило бы, а просто отображал заставку)

  • Xcode 4.3.2
  • iOS Deployment Target 4.3

Я продолжал видеть ответы на StackOverflow, в которых говорилось, что это проблема управления памятью, но это не имело никакого смысла для меня, так как отладочная версия работала отличнонормально при загрузке на мой iPhone 4S.Я также проверил настройки сборки, чтобы увидеть, чем отличаются эти два режима, и пропустил одно различие, которое имело значение в конце - оптимизация компилятора.

В настройках сборки -> под Apple LLVM compiler 3.1 генерация кода ->Уровень оптимизации, измените настройку выпуска со значения по умолчанию Самый быстрый, самый маленький [-Os] до Нет [-O0] .Исправлена ​​моя проблема.

Обнаружил, что решение в этом сообщении в блоге: http://www.mindjuice.net/2011/11/30/how-to-fix-an-app-that-crashes-in-release-but-not-debug/.

Документация Apple помогает, но не объясняет, почему делать толькообратное исправляет вещи:

Оптимизация кода любого вида приводит к более медленному времени сборки из-за дополнительной работы, вовлеченной в процесс оптимизации.Если ваш код меняется, как это происходит во время цикла разработки, вам не нужно включать оптимизацию.По мере того, как вы приближаетесь к концу своего цикла разработки, конфигурация сборки выпуска может дать вам представление о размере вашего готового продукта, поэтому уместен вариант «Самый быстрый, самый маленький».

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

Самый быстрый, самый маленький : компилятор выполняет все оптимизации, которые обычно не увеличивают размер кода.Это предпочтительный вариант для доставки кода, поскольку он дает вашему исполняемому файлу меньший объем памяти.

1 голос
/ 25 июля 2010

Пост

Некоторые

Подсказки!

Что вы подразумеваете под "провал"?Сбой?Повесьте?Отказаться от использования памяти?Каковы симптомы неудачи?Есть обратный след?У вас есть что-то в вашем коде, которое ведет себя по-разному в отладке и выпуске?Любые махинации типа #ifdef DEBUG?asserts с побочными эффектами?Вы связались с настройками компилятора?Есть C ++?Сборка?

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

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

Кроме того, вы выполнили сборку ипроанализировать и устранить любые проблемы, которые он указывает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...