存在信号处理程序时出现分段错误
收藏

尽管有一个SIGSEGV的信号处理程序,我还是遇到了分段错误。第一次数据被写入受保护的内存,我可以看到信号处理程序被调用,但是在信号处理程序退出之前,出现分段错误。
是什么引起的?我的SIGSEGV处理程序不应该捕获所有的分段错误吗?


最佳答案:

我可以看到,如果分段错误与操作系统不允许访问内存的堆栈指针有关,那么您将无法使用进程的当前堆栈指针进行任何调用…包括调用信号处理程序。换句话说,编译器为信号处理函数创建的序言必须在堆栈上设置激活记录…如果堆栈指针本身无效,则这是不可能的。一种可能发生这种情况的方法是溢出一个内存数组,然后将当前执行函数的激活记录写入该内存数组。
您可以通过sigaltstack()定义另一个内存区域作为信号处理程序的堆栈,然后在SA_ONSTACK中为信号设置sigaction()选项。这可能是你想试试的。
最后,如果使用非异步安全函数,或者以某种方式访问信号处理程序中操作系统分配给进程的内存段之外的指针或内存,也可能会遇到问题。

    公众号
    关注公众号订阅更多技术干货!