尽管有 SIGSEGV
的信号处理程序,但我还是遇到段错误。第一次将数据写入 protected 内存时,我可以看到调用了信号处理程序,但在信号处理程序退出之前,出现了段错误。
可能是什么原因造成的?我的 SIGSEGV
处理程序不是应该捕获所有段错误吗?
最佳答案
我可以看到如果段错误与操作系统不允许的堆栈指针访问内存相关,那么您将无法使用进程的当前堆栈指针进行任何调用......包括对信号处理程序的调用。换句话说,编译器为你的信号处理函数创建的序言必须在堆栈上设置一个激活记录......如果堆栈指针本身无效,那么这是不可能的。发生这种情况的一种方法是溢出内存数组,然后覆盖当前正在执行的函数的激活记录。
您可以通过 sigaltstack()
定义另一个内存区域用作信号处理程序的堆栈,然后在 sigaction 中设置
为信号。这可能是您想要尝试的东西。SA_ONSTACK
选项()
最后,如果您使用非异步安全函数或以某种方式访问信号处理程序中操作系统分配给您的进程的内存段之外的指针或内存,您也可能会遇到问题。
关于c - 存在信号处理程序时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6820303/