如何处理堆栈空间分段故障?

时间:2016-02-12 01:27:08

标签: c++ memory segmentation-fault

假设我使用gcc --stack,4194304

编译

接下来在我的程序中,我执行char what_is_wrong_with_me[8000000];

之类的操作

这会导致分段错误,但奇怪的是我有一个工作的segv_handler,如果我做了像char *stupid=0; *stupid='x';这样的愚蠢的事情,它会打印一条错误信息。

我的问题是,我如何处理堆栈空间段错误?

2 个答案:

答案 0 :(得分:2)

您可以处理此问题,但是您的主要筹码已经耗尽。您需要为信号处理程序设置备用堆栈。您可以使用sigaltstack系统调用

执行此操作

使用sigaction安装segfault处理程序时,您还需要SA_ONSTACK选项

答案 1 :(得分:1)

因此,您的流程耗尽了已分配的堆栈空间(故意,在您的情况下,但它是否有意无关紧要)。一旦尝试将下一个堆栈帧写入未分配的页面,就会向该进程发送SIGSEGV信号。

然后尝试调用已安装的信号处理程序。现在,让我们记住SIGSEGV就像任何其他信号一样。而且,如您所知,当信号处理程序在收到信号时被调用时,当信号处理程序返回时,该过程继续执行。

换句话说,信号处理程序被调用就好像它是一个函数调用一样,当函数调用返回时,原始执行线程继续运行。

当然,你知道函数调用需要发生什么,对吧?一个新的调用框架被推入堆栈,包含返回地址和其他一些东西。你知道,所以当函数调用返回时,原始执行线程从它停止的地方恢复运行(如果是信号,你也会在那里得到一个完整的寄存器转储,以及其余的CPU状态,但是那个's)一个不相关的细节。)

现在,或许,您可以自己弄清楚自己的问题的答案,为什么在这种情况下,当堆栈空间耗尽时,您的信号处理程序不会被调用...