c++错误信号处理

#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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值