0

ループ内でメモリをゼロにする SSE プロシージャがあります。ポインタがアラインされていない場合、ハンドラに入る SIGSEGV が発生します。このようなハンドラ ルーチンで詳細情報を取得できますか?どこで行われたかについての情報がありません。それから予測可能な方法で反応することはできますか? 私がそれを無視することを選択したとき、それは戻って、SIGSEGVを再び発生させるループにあったため、戻る必要があるように私には思えました(無視するとゼロ除算でそのような動作が得られ、それはさらに続きます)が、ここでは機能しませんそのような方法ですが、悲しいことに、無視した後にクラッシュするだけです。ここでもっと精巧な回復を行うことはできますか?

編集 - 追加

私のsignal.h(非常に古いwin32コンパイラですが、私はそれを使用しています)にそのようなものがあります

    /* _SIGCONTEXT contains exception info for WIN32 exceptions that were caught
     and turned into signals.  There will always be three 32-bit parameters
     passed to the user's signal handler.  Unused parameters will be 0.  The
    _PSIGCONTEXT parameter will always be the last (third) parameter.
      */

    typedef struct
     {
      struct _EXCEPTION_RECORD * _pexecptionrecord; /* defined in WINNT.H */
      struct _CONTEXT *          _pcontext;         /* defined in WINNT.H */
      unsigned long              _result;           /* return value for the SEH */
     } _SIGCONTEXT, *_PSIGCONTEXT;

     typedef int sig_atomic_t;   /* Atomic entity type (ANSI) */

     typedef void (*_CatcherPTR)(int);

     #define SIG_DFL ((_CatcherPTR)0)   /* Default action   */
     #define SIG_IGN ((_CatcherPTR)1)   /* Ignore action    */
     #define SIG_ERR ((_CatcherPTR)-1)  /* Error return     */

      //////////////////////////////////
     //skipped  #define SIGABRT  22  
     //         #define SIGFPE  8  .... constants block  here

     int raise(int __sig);

     void (*signal(int __sig, void (*__func)(int) )) (int);

Signal Raise は理解できましたが、SIGCONTEXT のデータにアクセスする方法や「キャッチャー」を使用する方法は?

4

1 に答える 1

2

一部のオペレーティングシステムでは、特定の状況下でSIGSEGV、SIGBUS、SIGILL、およびSIGFPEをキャッチして処理することができますが、クラッシュ以外のことを行うのは非常に悪い考えです。それらは、あなたがただ敷物の下で一掃するものではなく、あなたが修正する必要があるあなたのプログラムのバグを示しています。

しかし、あなたが本当に自分の足を撃ち、恐ろしいデバッグ不可能で維持不可能な混乱を残すことを本当に楽しんでいる場合は、ブードゥーが機能することを望みながらあなたとあなたの先祖を呪いながら他の人があなたの後に片付けなければならないでしょう、sigaction()とどのようにsiginfo_t。それらはあなたが必要とするものの少なくともいくつかの部分を含んでいます。

于 2012-10-09T09:29:54.983 に答える