未从共享库

时间:2015-08-24 14:44:46

标签: android c++ exception fstream libc++

我的二进制文件崩溃了以下几行

I DEBUG   : pid: 1190, tid: 1367, name: Binder_1  >>> /system/bin/fingerprint_proxy <<<
I DEBUG   : signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
I DEBUG   : Abort message: 'terminating with uncaught exception of type std::__1::ios_base::failure: ios_base::clear: unspecified iostream_category error'

导致异常的代码如下所示

try {
    std::ofstream out;
    out.exceptions( std::ofstream::failbit | std::ofstream::badbit );
    out.open("bad_path");
} catch(std::ios_base::failure &e) {
    // skipped
}

出于某种原因,没有抓住异常所以我添加了更多的catch块

try {
    std::ofstream out;
    out.exceptions( std::ofstream::failbit | std::ofstream::badbit );
    out.open("bad_path");
} catch(std::ios_base::failure &e) {
    // skipped
} catch(std::__1::ios_base::failure &e) {
    // skipped
} catch(std::exception &e) {
    // skipped
} catch(...) {
    // caught
}

这次只有最后一个catch块捕到了异常, 并且确定它不是我添加的继承问题。

try {
    throw std::ios_base::failure("miau");
} catch(std::exception &e) {
    // caught
}

我的Android.mk看起来像这样

include $(CLEAR_VARS)

LOCAL_CFLAGS :=  -Wall
LOCAL_CPPFLAGS := -Wno-write-strings -Wall -std=c++11 -fexceptions

LOCAL_SRC_FILES := test.cpp

LOCAL_MODULE := test_app
LOCAL_MODULE_TAGS := optional

include external/libcxx/libcxx.mk
include $(BUILD_EXECUTABLE)

我从共享库libc ++中获取std :: namespace和exception实现。所以包括&#34;包括external / libcxx / libcxx.mk&#34;。 所以我编译了libc ++。所以staticlly。

include $(CLEAR_VARS)

LOCAL_CFLAGS :=  -Wall
LOCAL_CPPFLAGS := -Wno-write-strings -Wall -std=c++11 -fexceptions

LOCAL_SRC_FILES := test.cpp

LOCAL_MODULE := test_app
LOCAL_MODULE_TAGS := optional

LOCAL_SHARED_LIBRARIES := libc++

include external/libcxx/libcxx.mk
include $(BUILD_EXECUTABLE)

它有效!

std :: exception子句捕获了异常, 虽然它将二进制大小乘以8,但这不是解决方案。

所以看起来共享库抛出的异常似乎没有被捕获。

任何人都知道为什么?

为您提供便利的要点 https://gist.github.com/amfern/2377e9a3cd1ccc0186ea

1 个答案:

答案 0 :(得分:0)

向LOCAL_CPPFLAGS添加-frtti解决了这个问题。

因为异常在内部使用RTTI,所以不指定-frtti标志将产生两个表,一个来自libc ++,一个来自我的二进制。 exceptions under the hood

注意:由于所有的android本机库都是在没有RTTI的情况下编译的,因此不可能将它们包含在-frtti编译的二进制文件库中。