共享库中的异常处理

时间:2018-03-27 16:07:17

标签: android c++ exception android-ndk shared-libraries

我将共享库PC交叉编译为带有-fexceptions标志的NDK(llvm编译器)并测试它从目标android设备上的可执行文件动态加载。

在库代码中,我有异常和处理程序,它们不在库外,所有try-catch都在里面。

在我的测试可执行文件中,我使用dlopen(... RTLD_NOW)加载库,并且try-catch正常工作。 (我实际上尝试了不同的标志,但无论如何处理异常都很好)

然后我有另一个第三方可执行文件调用我的库。我认为我的库加载方式和我一样,但不确定。但这次例外不起作用,它会崩溃

在库中测试代码(不是API extern" C"函数)

logcat("1");
try {
  throw 1;
} catch (...) {
  logcat("2");
}

" 2"总是发生在我的可执行文件中,永远不会发生在第三方可执行文件中(崩溃发生)

我还检查了设备上的malloc-debug标志,它没有设置(在build.prop中)

我的问题是:有没有办法让第三方可执行文件更改我的库的异常策略(考虑到try-catch都在共享库中),或者为什么会发生这种情况?

1 个答案:

答案 0 :(得分:1)

两个库必须使用相同的共享 STL进行异常处理才能跨共享库边界工作,并且这两个库必须使用RTTI。如果没有这个,就无法将捕获的异常的typeinfo与抛出的异常匹配。