2012-02-05 3 views
0

일부 오류 (세그먼테이션 오류)가 발생하면 응용 프로그램을 저장하려고합니다.리눅스의 예외 핸들러

이미 Windows에서 작동하는 코드가 있지만 Linux에서 작동하도록하는 데 문제가 있습니다.

Windows 버전 : 당신이 저장하고있는 데이터가 아마도 손상되었거나 다시 트리거 위반 세그멘테이션 수 있습니다 저장하기 때문에

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

+1

질문을 잊어 버렸습니다. 너 무슨 짓을 한거야? 무슨 문제가 있습니까? 어떤 도움이 필요합니까? –

+0

당신이 말하는 언어로 태그하는 것을 잊어 버렸습니다. – geoffspear

+0

http://stackoverflow.com/a/2436368/690032 – sverre

답변

0

그것은 세그먼트 위반에 데이터를 저장하려고하는 것은 좋은 생각이 항상 아니다. 하지만 신호를 잡아서 그에 따라 행동해야합니다. 자세한 내용은

#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

1

유일한 것은 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; 
}