Bei der Entwicklung einer SWIG-Wrapped-C++ - Bibliothek für Ruby stießen wir auf einen unerklärlichen Absturz bei der Ausnahmebehandlung innerhalb des C++ - Codes.segfault während __cxa_allocate_exception in SWIG-Wrapped-Bibliothek
Ich bin nicht sicher über die spezifischen Umstände, um das Problem neu zu erstellen, aber es geschah zuerst während eines Anrufs zu std::uncaught_exception
, dann nach ein paar Codeänderungen, verschoben zu __cxa_allocate_exception
während der Konstruktion der Ausnahme. Weder GDB noch Valgrind gaben einen Einblick in die Ursache des Absturzes.
Ich habe mehrere Verweise auf ähnliche Probleme gefunden, einschließlich:
- 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
Das übergeordnete Thema scheint eine Kombination aus zu sein Umstände:
- AC Anwendung auf mehr als eine C++ Bibliothek
- Mehr als eine Version von libstdc verbunden ++ verwendet wurde während der Kompilierung
- Im Allgemeinen ist die zweite Version von C++ verwendet wird, stammt aus einer binär nur Implementierung von libGL
- Das Problem tritt nicht auf, wenn Ihre Bibliothek mit einer C++ Anwendung zu koppeln, nur mit einer C-Anwendung
Die „Lösung“ ist ausdrücklich Ihre Bibliothek libstdC++ zu verknüpfen und möglicherweise auch mit libGL, Erzwingen der Reihenfolge der Verknüpfung.
Nachdem ich viele Kombinationen mit meinem Code versucht habe, ist die einzige Lösung, die ich gefunden habe, die LD_PRELOAD="libGL.so libstdc++.so.6" ruby scriptname
Option. Das heißt, keine der Kompilierungszeit-Verknüpfungslösungen machte einen Unterschied.
Mein Verständnis des Problems ist, dass die C++ - Laufzeit nicht ordnungsgemäß initialisiert wird. Indem Sie die Reihenfolge des Linkens erzwingen, starten Sie den Initialisierungsprozess und es funktioniert. Das Problem tritt nur bei C-Anwendungen auf, die C++ - Bibliotheken aufrufen, da die C-Anwendung selbst nicht mit libstdC++ verknüpft ist und die C++ - Laufzeit nicht initialisiert. Da SWIG (oder boost :: python) eine gängige Methode zum Aufrufen einer C++ - Bibliothek aus einer C-Anwendung ist, kommt SWIG häufig bei der Problemforschung vor.
Gibt es jemanden, der mehr Einblick in dieses Problem geben kann? Gibt es eine tatsächliche Lösung oder gibt es nur Workarounds?
Danke.
Die tatsächliche Ursache des Problems gefunden. Hoffentlich hilft das jemand anderem, diesen Fehler zu finden. Wahrscheinlich haben Sie irgendwo statische Daten, die nicht richtig initialisiert werden. Wir haben es getan, und die Lösung war im Boost-Log für unsere Code-Basis. https://sourceforge.net/projects/boost-log/forums/forum/710022/topic/3706109. Das eigentliche Problem ist die verzögerte geladene Bibliothek (plus Statik), nicht die möglicherweise mehrere Versionen von C++ aus verschiedenen Bibliotheken. Für weitere Informationen: http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.13 – lefticus
Sie sollten dies in eine Antwort kopieren, damit andere es einfacher sehen können. –