在Linux上的异常处理程序

问题描述:

我试图让我的应用程序在发生某些错误(分段错误)时进行保存。在Linux上的异常处理程序

我已经有了适用于Windows的代码,但是我很难在Linux上使用它。

Windows版本:

EXCEPTION_DISPOSITION __cdecl _SEHHandler(struct _EXCEPTION_RECORD *ExceptionRecord, void* EstablisherFrame, struct _CONTEXT *ContextRecord, void* DispatcherContext) 
{ 
    save(); 
} 

+1

你忘了提问了。你尝试了什么?你有什么困难?你需要什么帮助? – 2012-02-05 21:29:34

+0

你也忘了标记你正在谈论的语言。 – geoffspear 2012-02-05 21:30:06

+0

http://*.com/a/2436368/690032 – sverre 2012-02-05 21:30:41

这并不总是好主意,试图以节省段违规的数据,因为你保存数据可能损坏或保存可以再次触发分段违例。但你需要捕捉信号并采取行动。

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

void crashHandler(int sig) { 

    // do save 
} 

// install handlers 
signal(SIGBUS, crashHandler); 
signal(SIGSEGV, crashHandler); 

有关详细信息:http://www.alexonlinux.com/signal-handling-in-linux

你唯一能做的事情就是写的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; 
}