如何在从.so调用函数抛出异常时避免崩溃

时间:2011-06-17 07:25:46

标签: c++ c exception-handling unhandled-exception

这是我做的,我想优雅地处理这个例外:

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

然后我从main.cpp调用了函数so_main 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 个答案:

答案 0 :(得分:6)

尝试使用src/exception.c

编译-fexceptions
  

-fexceptions       启用异常处理。生成传播异常所需的额外代码。对于某些目标,这意味着GNU CC将为所有函数生成帧展开信息......

     

但是,在编译需要与使用C ++编写的异常处理程序正确互操作的C代码时,可能需要启用此选项。如果要编译不使用异常处理的旧C ++程序,您可能还希望禁用此选项。

答案 1 :(得分:1)

该函数可能抛出一个不是 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"
    }