【发布时间】:2014-09-17 09:44:17
【问题描述】:
我能够处理一次分段错误。但是当它再次发生时,它会导致分段错误。是否可以多次处理 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) 处理段错误,但第二个call(a) 引发段错误。
【问题讨论】:
-
您需要确保可以从分段错误中恢复。查看this问题了解更多详情。一般来说,为什么不调试到您没有根本没有分段错误的地步?
-
我很确定
signal_handler将从 c 代码中调用,因此您无法捕获您抛出的异常。捕捉在这里不起作用:ideone.com/4GiOiq。此外,即使你抓住了FoobarException,也会泄露它。 -
您可能对 gcc -fnon-call-exceptions 功能感兴趣,否则抛出的异常只会终止信号处理程序并继续崩溃
-
我认为
try/catch被指定用于捕获程序其他部分中抛出的异常作为软件设计的一部分,而不是处理硬件和软件陷阱。 -
您是否有理由首先尝试处理多个段错误?我能想到的唯一原因是在退出之前生成自定义报告和/或“优雅地”处理它。 AFAIK,当发生段错误时,您的程序已经进入“不安全”状态(想想受了致命伤的动物)