segfault во время __ cxa_allocate_exception в БОЛЬШОМ ГЛОТКЕ перенес библиотеку

В то время как разработка БОЛЬШОГО ГЛОТКА перенесла библиотеку C++ для Ruby, мы столкнулись с необъясненным катастрофическим отказом во время обработки исключений в коде C++.

Я не, несомненно, в определенных обстоятельствах воссоздам проблему, но это произошло сначала во время вызова к std::uncaught_exception, затем после того, как некоторый код изменяется, перемещенный в __cxa_allocate_exception во время конструкции исключения. Ни GDB, ни valgrind не обеспечили понимания причины катастрофического отказа.

Я нашел несколько ссылок на подобные проблемы, включая:

Переопределяющая тема, кажется, комбинация обстоятельств:

  • Приложение C связано больше чем с одной библиотекой C++
  • Больше чем одна версия libstdc ++ использовалась во время компиляции
  • Обычно вторая версия используемого C++ прибывает из реализации только для двоичного файла libGL
  • Проблема не происходит при соединении библиотеки с приложением C++, только с приложением C

"Решение" состоит в том, чтобы явно связать Вашу библиотеку с libstdc ++ и возможно также с libGL, вызвав порядок соединения.

После попытки многих комбинаций с моим кодом, единственное решение, что я нашел, что работы LD_PRELOAD="libGL.so libstdc++.so.6" ruby scriptname опция. Таким образом, ни одно из решений для соединения времени компиляции не имело значения.

Мое понимание проблемы - то, что время выполнения C++ правильно не инициализируется. Путем принуждения порядка соединения Вы загружаете процесс инициализации, и это работает. Проблема происходит только с приложениями C, называя библиотеки C++, потому что приложение C самостоятельно не связывается с libstdc ++ и не инициализирует время выполнения C++. Поскольку с помощью БОЛЬШОГО ГЛОТКА (или повышение:: Python), распространенный способ назвать библиотеку C++ из приложения C, именно поэтому ПОТЯНИТЕ, часто подходит при исследовании проблемы.

Любой там может дать больше понимания этой проблемы? Существует ли фактическое решение, или только обходные решения существуют?

Спасибо.

13
задан lefticus 6 May 2010 в 03:14
поделиться