2009-06-17 1 views
4

У меня есть тестовая программа под названием ftest. Он загружает файлы .so, содержащие тесты и запускает те тесты, которые он находит там. Один из этих тестов загружает и запускает .so, который содержит драйвер базы данных Postgres для нашего O/RM.Исключения из Linux из общего объекта (.so)

Когда драйвер Postgres генерирует исключение, которое определено в этом .so файле (или том, к которому он привязан, но ftest не ссылается на него) и попадает в тестовую структуру, деструктор исключений вызывает segfault.

Этот segfault возникает, когда скомпилированное исключение находится в .so, который был динамически загружен (с использованием dload).

Такая штука прекрасно работает в Windows с одинаковой архитектурой. Мы действительно не хотим ограничивать себя использованием только исключений из основных библиотек - надстройки должны быть бесплатными для создания своих собственных классов исключений и их нормальной работы.

Исключения составляют подклассы std :: exception. Иногда исключения могут быть определены в библиотеках (например, libpqxx), что означает, что исключения иногда также не поддаются нашему контролю.

Исключения выбрасываются использовать что-то вроде:

throw exception_class(exception_arguments); 

И ловят с помощью:

catch (std::exception &e) { 
    // handler code 
} 

Есть специальные опции компилятора нужно, чтобы получить эту работу? Нужно ли нам переключаться на исключения, используя throw new exception_class(args) (мы действительно не хотим этого делать)?

ответ

6

Если предположить, что с помощью GCC -

Append -Wl, -E при создании исполняемого вызова dlload(). Это экспортирует все стандартные символы типа из исполняемого файла, что должно позволить RTTI (при обнаружении исключения) работать правильно.

VC++ использует строку, сравниваемую с совпадением типаinfo, приводит к более медленному dynamic_cast <> и т. Д., Но меньшим двоичным файлам. g ++ использует указатель.

Я столкнулся с такой же проблемой при попытке использовать классы чистого виртуального интерфейса, реализованные во время загрузки .so.

Существует несколько статей, относящихся к предмету, плавающим вокруг в сети.

надежды, что помогает, Hayman.

+0

Это на самом деле деструктор, у которого есть проблема не улов. Я не удивлюсь, если это местоположение виртуальной таблицы - возможно, .so не дает права на чтение на странице, в которую загружается таблица, так что деструктор не может быть прочитан. Однако это чистое предположение. Я посмотрю, смогу ли я решить, как установить эти параметры через Boost.Build. – KayEss

+0

-Wl, E, похоже, не имеет никакого значения :( – KayEss

+0

На самом деле, я думаю, что -Wl, E действительно имел эффект - возникла вторая проблема, когда исключения также делали .so выгрузкой до того, как исключение было Завершение обоих этих средств означает, что теперь мы получаем исключения, работающие без segfaults. yay! – KayEss

 Смежные вопросы

  • Нет связанных вопросов^_^