Exceções no Linux de um objeto compartilhado (.so)
-
05-07-2019 - |
Pergunta
Eu tenho um programa de teste chamado ftest. arquivos ele carrega .so que contêm testes e executa os testes que ele encontra lá. Um destes testes cargas e executa um .so que contém um driver de banco de dados Postgres para o nosso O / RM.
Quando o driver Postgres lança uma exceção que é definido no que .so arquivo (ou um que as vincula, mas não ftest não unir a) e é pego pela estrutura de teste os gatilhos exceção destructor um segfault.
Este segfault acontece sempre que a excepção é compilada num .so que tenha sido carregado dinamicamente (usando dload).
Este tipo de coisa funciona bem no Windows que tem a mesma arquitetura. Nós realmente não quer limitar-se a apenas exceções de uso que são das bibliotecas centrais -. Suplementos deve ser livre para criar suas próprias classes de exceção e tê-los tratado normalmente
As exceções são subclasses de std :: exceção. Às vezes, as exceções podem ser definidas em bibliotecas (tais como libpqxx) o que significa que as exceções são, por vezes, fora de nosso controle também.
exceções são lançadas usando algo como:
throw exception_class( exception_arguments );
E for pego usando:
catch ( std::exception &e ) {
// handler code
}
Existe alguma opção especial compilador necessário para começar este trabalho? Será que precisamos de mudar para lançar exceções via throw new exception_class( args )
(nós realmente não quero fazer isso)?
Solução
Assumindo que o seu usando gcc -
Anexar -Wl, -E quando você construir o dlload chamada executável (). Isso exporta todas as informações Tipo de símbolos do executável, que deverá permitir a RTTI (quando captura a exceção) para funcionarem correctamente.
VC ++ corda usos compara a corresponder typeinfo, resulta em mais lentas dynamic_cast <> etc, mas menores binários. ponteiro usos g ++ compara.
Eu encontrei o mesmo problema ao tentar usar puros aulas interfaces virtuais implementadas em um run-time carregados .so.
Existem alguns artigos relacionados com o tema flutuando ao redor na rede também.
espero que ajude, Hayman.