Запуск приложения Cocoa под otest вызывает dyld_misaligned_stack_error в режиме выпуска

У меня есть проблема, с которой я боролся некоторое время.

У меня есть библиотека Cocoa, которая действует как оболочка для библиотеки C++. Библиотека C++ тестируется с помощью набора модульных тестов BOOST. Тесты выполняются нормально как в режиме отладки, так и в режиме выпуска.

Чтобы протестировать обертку Cocoa, я использую otest. Вот странная часть, тесты нормально работают в режиме отладки, но терпят неудачу в режиме выпуска. Чтобы убедиться, что это не что-то в коде, я взял содержимое тестов и скомпилировал их как отдельное приложение Cocoa, которое использует код-оболочку. Это нормально работает как при выпуске, так и при отладке.

Когда otest терпит неудачу, я получаю трассировку стека, которая не имеет большого смысла и заканчивается dyld_misaligned_stack_error.

Еще одна странная вещь, которую я заметил, заключается в том, что при запуске otest из командной строки, а не из XCode, если я указываю DYLD_LIBRARY_PATH и DYLD_FRAMEWORK_PATH на отладочную версию библиотеки C++, тесты проходят. Однако я подтвердил, что весь мой тестовый код компилируется с флагами Release.

Любая помощь будет принята с благодарностью!

Спасибо


person Alex    schedule 16.02.2009    source источник


Ответы (1)


Попробуйте добавить флаг -mstackrealign во флаги C в релизной версии.

-mstackrealign

Выровняйте стек при входе. На Intel x86 параметр -mstackrealign создаст альтернативный пролог/эпилог, который перестраивает стек времени выполнения. Это поддерживает смешивание устаревших кодов, которые сохраняют выровненный по 4 байта стек, с современными кодами, которые сохраняют 16-байтовый стек для совместимости с SSE.

Для справки см. справочную страницу GCC.

person diciu    schedule 17.02.2009
comment
Спасибо за ответ. Однако в данном случае это не похоже на причину, хотя и помогло найти исправление. По какой-то причине удаление NDEBUG из флагов C в режиме Release устранило проблему даже без опции -mstackrealign. Я не понимаю, почему, хотя. - person Alex; 17.02.2009
comment
Неважно :) Я забыл добавить этот флаг в релизную версию моих библиотек C++. Большое спасибо, ваш ответ помог найти проблему. - person Alex; 17.02.2009