在Linux上的异常处理程序
问题描述:
我试图让我的应用程序在发生某些错误(分段错误)时进行保存。在Linux上的异常处理程序
我已经有了适用于Windows的代码,但是我很难在Linux上使用它。
Windows版本:
EXCEPTION_DISPOSITION __cdecl _SEHHandler(struct _EXCEPTION_RECORD *ExceptionRecord, void* EstablisherFrame, struct _CONTEXT *ContextRecord, void* DispatcherContext)
{
save();
}
答
这并不总是好主意,试图以节省段违规的数据,因为你保存数据可能损坏或保存可以再次触发分段违例。但你需要捕捉信号并采取行动。
#include <stdio.h>
#include <signal.h>
void crashHandler(int sig) {
// do save
}
// install handlers
signal(SIGBUS, crashHandler);
signal(SIGSEGV, crashHandler);
答
你唯一能做的事情就是写的SIGSEGV
信号自己的信号处理程序。只要由此过程引起的不正确内存引用发生,OS就会将该信号发送到进程。
最小草案代码在这里提供。 signal
函数被声明为手册页弃用,建议使用sigaction
。
#include <signal.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
void handle_sigsegv(int sig)
{
fprintf(stderr,"segment\n");
// do something else here...
_exit(1);
}
int main(void)
{
struct sigaction s;
sigset_t sst;
sigemptyset(&sst);
s.sa_handler = handle_sigsegv;
s.sa_mask = sst;
s.sa_flags = 0;
if(sigaction(SIGSEGV, &s, NULL) != 0)
{
perror("sigaction");
return 1;
}
*((int*)0) = 3579; // this fails, invoking the handler
return 0;
}
你忘了提问了。你尝试了什么?你有什么困难?你需要什么帮助? – 2012-02-05 21:29:34
你也忘了标记你正在谈论的语言。 – geoffspear 2012-02-05 21:30:06
http://*.com/a/2436368/690032 – sverre 2012-02-05 21:30:41