Lors du développement d'une bibliothèque C++ SWIG pour Ruby, nous avons rencontré un crash inexpliqué lors de la gestion des exceptions dans le code C++.segfault pendant __cxa_allocate_exception dans la bibliothèque enveloppée SWIG
Je ne suis pas sûr des circonstances spécifiques pour recréer le problème, mais il est arrivé d'abord lors d'un appel à std::uncaught_exception
, puis après quelques modifications de code, déplacé à __cxa_allocate_exception
pendant la construction d'exception. Ni GDB ni valgrind n'ont fourni d'informations sur la cause de l'accident.
que j'ai trouvé plusieurs références à des problèmes similaires, y compris:
- http://wiki.fifengine.de/Segfault_in_cxa_allocate_exception
- http://forums.fifengine.de/index.php?topic=30.0
- http://code.google.com/p/osgswig/issues/detail?id=17
- https://bugs.launchpad.net/ubuntu/+source/libavg/+bug/241808
Le thème principal semble être une combinaison de circonstances:
- application AC est lié à plus d'un C++ bibliothèque
- Plus d'une version de libstdC++ a été utilisé lors de la compilation
- En général, la deuxième version de C++ utilisé provient d'une implémentation binaire seulement libGL
- Le problème ne se produit pas lors de la liaison de votre bibliothèque avec une application C++, uniquement avec une application C
La « solution » est de lier explicitement votre bibliothèque libstdC++ et peut-être aussi avec libGL, forçant l'ordre de liaison.
Après avoir essayé de nombreuses combinaisons avec mon code, la seule solution que j'ai trouvée qui fonctionne est l'option LD_PRELOAD="libGL.so libstdc++.so.6" ruby scriptname
. Autrement dit, aucune des solutions de liaison au moment de la compilation n'a fait de différence.
Ma compréhension du problème est que l'exécution de C++ n'est pas initialisée correctement. En forçant l'ordre de liaison vous amorcez le processus d'initialisation et cela fonctionne. Le problème se produit uniquement avec les applications C appelant des bibliothèques C++ car l'application C n'est pas elle-même liée à libstdC++ et n'initialise pas l'exécution C++. Parce que l'utilisation de SWIG (ou boost :: python) est un moyen courant d'appeler une bibliothèque C++ à partir d'une application C, c'est pourquoi SWIG apparaît souvent lors de la recherche du problème.
Est-ce que quelqu'un peut donner plus d'informations sur ce problème? Existe-t-il une solution réelle ou n'existe-t-il que des solutions de contournement?
Merci.
Trouvé la véritable cause du problème. Espérons que cela aidera quelqu'un d'autre à rencontrer ce bug. Vous avez probablement des données statiques quelque part qui ne sont pas correctement initialisées. Nous l'avons fait, et la solution était dans boost-log pour notre base de code. https://sourceforge.net/projects/boost-log/forums/forum/710022/topic/3706109. Le vrai problème est le retard bibliothèque chargée (plus statique), et non les versions potentiellement multiples de C++ de différentes bibliothèques. Pour plus d'informations: http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.13 – lefticus
Vous devez copier ceci dans une réponse pour que les autres puissent voir plus facilement. –