2012-02-05 9 views
0

エラー(セグメンテーションフォールト)が発生したときにアプリケーションを保存しようとしています。linuxの例外ハンドラ

私はすでに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; 
} 
関連する問題