我的二进制文件崩溃了以下几行
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
答案 0 :(得分:0)
向LOCAL_CPPFLAGS添加-frtti解决了这个问题。
因为异常在内部使用RTTI,所以不指定-frtti标志将产生两个表,一个来自libc ++,一个来自我的二进制。 exceptions under the hood
注意:由于所有的android本机库都是在没有RTTI的情况下编译的,因此不可能将它们包含在-frtti编译的二进制文件库中。