Как избежать сбоя при вызове функции, вызывающей исключение из .so - PullRequest
4 голосов
/ 17 июня 2011

Вот что я сделал, я хочу изящно обработать это исключение:

code_snippet: my.cpp

#include<iostream>
extern "C" void some_func()
{
    throw "(Exception Thrown by some_func!!)";
}

code_snippet: exception.c

#include <stdio.h>
extern void some_func();
int so_main()
{
    some_func();
    return 0;
}

Из двух приведенных выше фрагментов я создал shared_object libexception.so с помощью следующих команд:

g++ -c -fPIC src/my.cpp
gcc -c -ansi -fPIC src/exception.c
g++ -fPIC -shared -o libexception.so

Затем я вызвал функцию so_main из моего main.cpp. code_snippet: main.cpp

#include<iostream>
#include <dlfcn.h>
using namespace std;
extern "C" void some_func();
int main()
{
    int (*fptr)() = 0;
    void *lib = dlopen("./libexception.so", RTLD_LAZY);
    if (lib) {
        *(void **)(&fptr) = dlsym(lib, "so_main");
        try{
           if(fptr) (*fptr)();    <-- problem lies here
           //some_func();        <-- calling this directly won't crash
        }
        catch (char const* exception) {
            cout<<"Caught exception :"<<exception<<endl;
        }
    }
return 0;

}

последняя команда: g ++ -g -ldl -o main.exe src / main.cpp -L lib / -lexception

При выполнении main.exe происходит сбой. Может ли кто-нибудь помочь мне определить, в чем заключается проблема и как избежать этого сбоя (У нас уже есть архитектура, в которой некоторые .SO вызывают функцию extern c ++, поэтому ее нельзя изменить, мы хотим обрабатывать ее только в main.cpp )

Ответы [ 2 ]

6 голосов
/ 17 июня 2011

Попробуйте скомпилировать src/exception.c с -fexceptions

-fexceptions Включить обработку исключений.Создает дополнительный код, необходимый для распространения исключений.Для некоторых целей это подразумевает, что GNU CC будет генерировать информацию о разворачивании кадров для всех функций ...

Однако, вам может потребоваться включить эту опцию при компиляции кода C, который должен правильно взаимодействовать с написанными обработчиками исключений.в C ++ .Вы также можете отключить эту опцию, если вы компилируете старые программы на C ++, которые не используют обработку исключений.

1 голос
/ 17 июня 2011

Эта функция, вероятно, выдает исключение, которое не является char *, поэтому вы его не перехватываете.

попробуйте использовать обобщенный улов:

   *(void **)(&fptr) = dlsym(lib, "so_main");
    try{
       if(fptr) (*fptr)();    <-- problem lies here
       //some_func();        <-- calling this directly won't crash
    }
    catch (char const* exception) {
        cout<<"Caught exception :"<<exception<<endl;
    }
    catch (...) {
        cout<<"Caught exception : Some other exception"
    }
...