【问题标题】:How do I handle out of stack space segmentation fault?如何处理堆栈空间外分段错误?
【发布时间】:2016-05-23 01:13:33
【问题描述】:
假设我使用gcc --stack,4194304编译
接下来在我的程序中我会做类似char what_is_wrong_with_me[8000000];
这将导致分段错误,但奇怪的是我有一个工作的 segv_handler,如果我在其中执行像 char *stupid=0; *stupid='x'; 这样的愚蠢操作,它将打印一条错误消息。
我的问题是,我该如何处理堆栈空间外的段错误?
【问题讨论】:
标签:
c++
memory
segmentation-fault
【解决方案1】:
你可以处理这个问题,但你已经用尽了你的主要堆栈。您需要为信号处理程序设置备用堆栈。你可以通过sigaltstack 系统调用来做到这一点
使用sigaction 安装段错误处理程序时,您还需要 SA_ONSTACK 选项
【解决方案2】:
因此,您的进程耗尽了其分配的堆栈空间(在您的情况下是有意的,但无论是否有意)。一旦尝试将下一个堆栈帧写入未分配页面,就会向进程发送SIGSEGV 信号。
然后尝试调用已安装的信号处理程序。现在,让我们记住SIGSEGV 就像任何其他信号一样。而且,如您所知,当接收到信号时调用信号处理程序时,当信号处理程序返回时,进程会继续执行。
换句话说,信号处理程序就像函数调用一样被调用,当函数调用返回时,原来的执行线程继续运行。
当然,您知道函数调用需要发生什么,对吗?一个新的调用帧被压入堆栈,包含返回地址和其他一些东西。你知道,所以当函数调用返回时,原来的执行线程会从它停止的地方继续运行(如果有信号,你还会在那里得到一个完整的寄存器转储,以及其余的 CPU 状态,但这是一个无关紧要的细节) .
现在,也许,你可以自己弄清楚你自己的问题的答案,为什么在这种情况下,当堆栈空间耗尽时,你的信号处理程序没有被调用......