У меня есть тестовая программа под названием 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)
(мы действительно не хотим этого делать)?
Это на самом деле деструктор, у которого есть проблема не улов. Я не удивлюсь, если это местоположение виртуальной таблицы - возможно, .so не дает права на чтение на странице, в которую загружается таблица, так что деструктор не может быть прочитан. Однако это чистое предположение. Я посмотрю, смогу ли я решить, как установить эти параметры через Boost.Build. – KayEss
-Wl, E, похоже, не имеет никакого значения :( – KayEss
На самом деле, я думаю, что -Wl, E действительно имел эффект - возникла вторая проблема, когда исключения также делали .so выгрузкой до того, как исключение было Завершение обоих этих средств означает, что теперь мы получаем исключения, работающие без segfaults. yay! – KayEss