公司的android代码里面有部分是native的,native代码偶尔会有崩溃。有些bug是偶现,很难解决。但是不解决应用直接闪退了,怎么巧妙的避开这种崩溃呢? 如下是一种思路。
#include <iostream>
#include <vector>
#include <thread>
using namespace std;
#include <string.h>
#include <signal.h>
#include <setjmp.h>
__thread jmp_buf jb; //__thread的作用可以保证每个线程一份.
void test1() {
char * p = NULL;
std::cout << *p << endl;
}
void test() {
std::cout << "test" << std::endl;
int r = setjmp(jb);
if (r == 0) {
std::cout << "setjmp" << std::endl;
test1();
} else if (r == 1) {
std::cout << "longjmp" << r << endl;
return;
}
}
void mysig(int a) {
std::cout << "sigaction:" << a << endl;
longjmp(jb, 1);
}
int main() {
signal(SIGSEGV, mysig);
signal(SIGBUS, mysig);
signal(SIGABRT, mysig);
signal(SIGFPE, mysig);
signal(SIGILL, mysig);
std::vector<std::thread> all;
for (int i = 0; i < 30; i++) {
std::thread t(test);
all.emplace_back(std::move(t));
}
for (int i = 0; i < all.size(); i++) {
all[i].join();
}
}
利用setjmp和longjmp可以巧妙的避开可能的错误