Вопрос

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

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

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

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

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

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

throw exception_class( exception_arguments );

И пойманы на использовании:

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

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

Это было полезно?

Решение

Предполагая, что вы используете gcc -

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

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

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

В сети также есть несколько статей, касающихся этой темы.

надеюсь, это поможет, Хейман.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top