在C ++中多次处理分段错误

时间:2014-09-17 09:44:18

标签: c++ segmentation-fault sigsegv

我能够处理一次分段错误。但是当它再次发生时会导致分段错误。是否有可能多次处理sigsegv信号?

#define _POSIX_SOURCE
#include <signal.h>
#include <stdio.h>

int *a;

class FoobarException
{
  int thingy;
};

void signal_handler(int signum, siginfo_t *info, void *)
{
  printf("signal_handler\n");
  FoobarException *f = new FoobarException;
  throw f;
}

void call(int * c)
{
  struct sigaction act;
  act.sa_sigaction = signal_handler;
  sigemptyset (&act.sa_mask);
  act.sa_flags = SA_SIGINFO;
  sigaction (11, &act, NULL);

  try
    {
      printf("%d\n", *a);
    }
  catch (FoobarException *f)
    {
      printf("Hello!\n");
    }
}

int main()
{ 
  int *b;
  call(b);
  printf("I am here.\n");
  call(a);
}

第一个call(b)处理seg错误,但第二个call(a)引发了一个seg错误。

2 个答案:

答案 0 :(得分:2)

一旦出现Segmentation故障,并且您处理异常,但您没有恢复原因。赌注将是避免seg错误。在您的示例程序中,您有指针ab但未分配,因此,ab包含垃圾(未分配),访问*a因此存在风险,导致seg故障。

相反,为ab分配足够的空间,例如,

a = (int *) malloc(sizeof (int));

同样,b

完成后不要忘记解除分配,例如,

free(a);

答案 1 :(得分:1)

您无法使用C ++ try / catch块来处理信号,因为POSIX 信号与C ++ 例外不同>。例如, signals 是异步的,由内核触发,而C ++ 例外是同步的:

  

您需要特别注意编写处理函数,因为   它们可以异步调用。也就是说,可能会调用一个处理程序   在程序的任何一点,不可预测。如果两个信号到达   在很短的时间间隔内,一个处理程序可以在另一个处理程序中运行。

您可以找到有关如何编写正确信号处理程序的here的更多信息。看看volatile sig_atomic_t