Приложение немедленно аварийно завершает работу на iOS 3.x при компиляции с конфигурацией сборки Release.

Столкнулся с довольно "загадочной" проблемой. Мое приложение отлично работает со всеми конфигурациями сборки на устройствах под управлением iOS 4.x, но оно дает сбой на iPhone под управлением iOS 3.x сразу после запуска, но только при компиляции с конфигурацией Release. Однако с отладочной конфигурацией он работает без проблем.

Я потратил много времени на изучение возможных причин этого, но пока мне не повезло. Я использую XCode 3.2.4 с базовым SDK iOS 4.1, используя компилятор LLVM GCC. Согласно журналу сбоев, приложение вылетает на самой первой строке кода в applicationDidFinishLaunching: реализация метода, где вызывается только простая [[SomeObject alloc] init] с сообщением EXC_BAD_ACCES, что указывает на то, что метод alloc неправильно выделил экземпляр (?) .

Когда я переключаюсь на компилятор GCC 4.2, журнал сбоев сообщает о совершенно другом месте возникновения сбоя, но я предполагаю, что это то же самое...

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

Спасибо за любую помощь.


person Matthes    schedule 24.09.2010    source источник
comment
публикация кода, вызывающего сбой, поможет.   -  person TomH    schedule 24.09.2010
comment
Хм, это забавно, потому что даже когда я удаляю/закомментирую проблемный кусок кода, он просто вылетает на следующей же инструкции. Похоже, что он не выделяет структуры данных или, что более вероятно, классы не распознаются должным образом или что-то в этом роде. Злиться на это...   -  person Matthes    schedule 24.09.2010
comment
После дальнейшего расследования я обнаружил, что это может быть как-то связано со сторонними библиотеками или, возможно, с тем, как они связаны. Такое впечатление, что он вылетает при вызовах классов из такой библиотеки. Есть идеи, пожалуйста?   -  person Matthes    schedule 24.09.2010


Ответы (1)


Используете ли вы компилятор LLVM для сборки релиза? По моему опыту, компилятор LLVM будет слабо связывать вызовы API. Это позволяет запускать приложение 3.x, даже если оно имеет вызовы API 4.x, если эти вызовы никогда не выполняются. Приложения 3.x, скомпилированные с помощью GCC, будут аварийно завершать работу при запуске, когда динамический загрузчик попытается разрешить API 4.x.

person Cory Pratt    schedule 09.12.2010