SIGSEGV康复?

时间:2012-10-09 09:01:00

标签: c winapi assembly x86

我有一些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);
我知道信号提升,但如何获取SIGCONTEXT数据或使用'捕手'?

1 个答案:

答案 0 :(得分:2)

虽然在某些情况下某些操作系统可能会捕获并处理SIGSEGV,SIGBUS,SIGILL和SIGFPE,但除了崩溃之外做任何其他事情都是一个非常糟糕的主意。它们表示您的程序中需要修复的错误,而不是您在地毯下扫描的错误。

但是如果你真的很喜欢自己在脚下射击并且留下可怕的不可思议和不可维护的混乱,其他人将在你诅咒你和你的祖先同时诅咒你和你的祖先时必须清理,同时希望看到巫术的文件()以及如何siginfo_t。它们至少包含您需要的部分内容。