尽管信号处理程序为SIGSEGV
,但我仍遇到分段错误。首次将数据写入受保护的存储器时,我可以看到信号处理程序被调用,但在信号处理程序退出之前,会出现分段错误。存在信号处理程序时出现分段错误
什么可能导致它?我的SIGSEGV
处理程序是否应该捕获所有的分段错误?
尽管信号处理程序为SIGSEGV
,但我仍遇到分段错误。首次将数据写入受保护的存储器时,我可以看到信号处理程序被调用,但在信号处理程序退出之前,会出现分段错误。存在信号处理程序时出现分段错误
什么可能导致它?我的SIGSEGV
处理程序是否应该捕获所有的分段错误?
我可以看到,如果分段错误与堆栈指针访问内存不兼容,那么操作系统不允许使用当前堆栈指针进行任何调用。包括呼叫信号处理程序。换句话说,为您的信号处理函数编译器创建的序言必须在堆栈上设置一个激活记录......如果堆栈指针本身无效,那么这是不可能的。一种可能发生的方式是溢出一个内存数组,然后写入当前正在执行的函数的激活记录。
您可以通过sigaltstack()
定义另一个存储器区域作为信号处理器的堆栈,然后在sigaction()
中为信号设置SA_ONSTACK
选项。这可能是你可能想要尝试的。
最后,如果您使用非异步安全函数或以某种方式访问由信号处理程序中的操作系统分配给您的进程的内存段之外的指针或内存,也可能遇到问题。
如果您的信号处理程序反过来激起另一个信号,当然不会被您的信号处理程序捕获,因为您会有一种无限循环。
你希望通过处理一个'SEGV'信号来完成什么? –