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)?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top