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 的数据或使用 'catcher' ?

4

1 回答 1

2

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

但是,如果您真的喜欢在脚上射击自己并留下可怕的无法调试和无法维护的混乱,其他人将不得不在您之后清理,同时诅咒您和您的祖先,同时希望巫术有效,请查看 sigaction() 的文档和如何 siginfo_t。它们至少包含您需要的某些部分。

于 2012-10-09T09:29:54.983 回答