ОК, в общем, обработка исключений сильно зависит от операционной системы. Я собираюсь сделать некоторые предположения и попытаться дать общее руководство. Пожалуйста, знайте, что это ни в коем случае не исчерпывающий ответ, но он должен послужить отправной точкой.
Я предполагаю, что:
В большинстве случаев вы заинтересованы в защите от утечек памяти.
Вы не заинтересованы в Windows (которая является целым другим шариком воска), так как вы упомянули dlopen (в противном случае вы сказали бы LoadLibrary)
что вам известны нюансы связывания с символами C ++. Если вы не читали об этом в mini howto на dlopen c ++
Вообще говоря
Не существует общего решения описанной проблемы без привлечения специализированных операционных систем, предоставляющих изолированную программную среду для сегментов данных и кода. Существуют Trusted Systems и специализированные ядра операционных систем, которые могут это делать, но я предполагаю, что вы хотите сделать это на старый добрый * nix или windows.
Компилятор еще больше усложняет проблемы (генерирует ли ваш компилятор C ++ слабые символы по умолчанию? Как правило, это будет) Это влияет на то, как происходит обработка исключений в try-catch.
Простая обработка исключений операционной системы, которая выдает сигналы (SIGSEGV, SIGFPE и т. Д.):
В системе POSIX, поддерживающей sigaction ...
Допустим, вы хотите защитить от общих вещей, таких как неправильная адресация памяти. Захватите SIGSEG с помощью sigaction перед тем, как открыть библиотеку (для защиты от функций .init), а затем также выполните проверку сигнала перед вызовом функции в библиотеке. Подумайте об использовании SA_STACK, чтобы убедиться, что ваш обработчик перепрыгивает в стек, над которым у вас есть хороший контроль, и SA_SIGINFO, чтобы ваш обработчик получил информацию об источнике.
Хорошее начало для этого - Обработка сигналов в руководстве по GNU libc
В C ++: используйте обертки и с try-catch для отлова мягких исключений
попробуй {
Foo ();
}
ловить() {
// сделай что-нибудь
}
где foo - слабый символ, указывающий на функцию в вашей dll см. Мини-инструкции c ++ dlopen для гораздо большего количества примеров и деталей о загрузке классов и т. Д.
Если у вас есть более конкретные потребности, опубликуйте их, я посмотрю, смогу ли я предоставить больше информации.
Приветствия