Сборка с LLVM и любая оптимизация приводят к сбою приложения при запуске

Когда я пытаюсь создать свое приложение с LLVM 2.0 в XCode 4.0.1 и с любым уровнем или оптимизацией, которые не являются ничем (что-либо, кроме -O0), приложение вылетает после того, как я запускаю его на устройстве (симулятор в порядке). Кажется, я не могу отладить сбой, поскольку это не происходит, когда я встраиваю xcode и подключаюсь через GDB/LLDB. Кроме того, сбой происходит только тогда, когда я собираю приложение в командной строке с помощью xcodebuild; Построение через XCode IDE не приводит к сбою даже при одинаковых настройках проекта. Я не вижу никакой полезной информации в журналах сбоев, так как сбой происходит вне моего кода:

Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00b53400
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   ???                             0x00b53400 0 + 11875328

Он не будет правильно символизировать, поскольку не знает, в какой библиотеке произошел сбой.

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

Что здесь может происходить, и как я могу это отладить? Что может XCode IDE делать по-другому при сборке и развертывании приложения по сравнению с интерфейсом командной строки xcodebuild?

2 ответа

Решение

Обновление до Xcode 4.0.2.

Это исправило эту проблему (сбой при запуске ARMv6, но не ARMv7 с включенной оптимизацией) для нас.

У нас была та же проблема с нашим приложением. Это повлияло только на код armv6 в сборках Release/Distribution и, таким образом, только на iPhone 3G и iPod Touch 2G. Но вопреки вашему описанию, это можно было воспроизвести с помощью XCode (мы не используем xcodebuild).

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

Переход на более старый компилятор решил проблему.

Я подал ошибку в Apple. Пожалуйста, подайте один тоже, как говорят, чтобы повысить приоритет ошибки.

Есть больше людей, сообщающих о той же самой проблеме:

Другие вопросы по тегам