#include <csignal>
#include <execinfo.h>
static struct sigaction segv_sig_action;
void print_backtrace(int sig) {
void *ptr[1024];
printf("AN ERROR!!!\n");
int myesp;
__asm__ ("movl %%esp,%0":"=r"(myesp));
printf("myesp is %#x,most acc %#x\n", myesp, (uint32_t) (myesp - 65536 - 32 * sizeof(uint64_t)));
int bk_len = backtrace(ptr, 1024);
backtrace_symbols_fd(ptr, bk_len, STDOUT_FILENO);
if (SIGSEGV == sig) {
segv_sig_action.sa_handler(sig);
}
}
void signal_handle(int sig) {
// 处理一些事情。。。
if ((SIGSEGV == sig) || (SIGABRT == sig) || (SIGPIPE == sig)) {
print_backtrace(sig);
exit(EXIT_FAILURE);
} else {
printf("TERMINATE !!!\n");
exit(EXIT_SUCCESS);
}
}
void SigProcess() {
setvbuf(stdout, 0, _IONBF, 0);
fclose(stderr);
struct sigaction act;
memset(&act, '\0', sizeof(act));
act.sa_handler = signal_handle;
sigaction(SIGSEGV, &act, &segv_sig_action);
sigaction(SIGINT, &act, NULL);
sigaction(SIGTERM, &act, NULL);
sigaction(SIGABRT, &act, NULL);
sigaction(SIGPIPE, &act, NULL);
sigaction(SIGBUS, &act, NULL);
}
c++错误信号处理
最新推荐文章于 2023-11-16 15:19:09 发布