2009-02-16 5 views
0

J'ai un problème avec lequel je me bats depuis un moment.L'exécution de l'application Cocoa sous le plus grand nombre de causes dyld_misaligned_stack_error en mode Libération

J'ai une bibliothèque Cocoa qui agit comme un wrapper pour une bibliothèque C++. La bibliothèque C++ est testée en utilisant un ensemble de tests unitaires BOOST. Les tests s'exécutent normalement dans les deux modes de débogage et de libération.

Afin de tester l'emballage de cacao que j'utilise otest. Voici la partie étrange, les tests s'exécutent normalement en mode debug mais échouent en mode release. Pour s'assurer que ce n'est pas quelque chose dans le code, j'ai pris le contenu des tests et les compilés comme une application Cocoa séparée qui utilise le code de l'encapsuleur. Cela fonctionne normalement à la fois sous la version et le débogage.

Lorsque otest échoue, j'obtiens une trace de pile qui n'a pas grand sens et se termine par dyld_misaligned_stack_error. Une autre chose étrange que j'ai remarquée est que lorsque je commence à partir d'une ligne de commande plutôt que de XCode si je pointe DYLD_LIBRARY_PATH et DYLD_FRAMEWORK_PATH vers la version Debug de la bibliothèque C++ les tests passent. J'ai confirmé cependant que tout mon code de test est en train d'être compilé avec les indicateurs de version.

Toute aide serait grandement appréciée!

Merci

Répondre

1

Essayez d'ajouter le drapeau "-mstackrealign" dans les drapeaux C dans la version.

-mstackrealign

réaligner la pile à l'entrée. Sur l'Intel x86, l'option -mstackrealign génère un prologue/épilogue alternatif qui réaligne la pile d'exécution . Cela prend en charge le mélange des codes hérités qui conservent une pile alignée sur 4 octets avec des codes modernes qui conservent une pile de 16 octets pour la compatibilité SSE.

Consultez la page de manuel de GCC pour référence.

+0

Merci pour la réponse. Cependant, cela ne semble pas être la raison dans ce cas, même si cela a aidé à découvrir une solution. Pour une raison quelconque, la suppression de NDEBUG des indicateurs C en mode Release a résolu le problème même sans l'option -mstackrealign. Je ne comprends pas pourquoi. – Alex

+0

Nevermind :) J'ai oublié d'ajouter ce drapeau pour publier la version de mes bibliothèques C++. Merci beaucoup, votre réponse a aidé à trouver le problème. – Alex

Questions connexes