【问题标题】: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 状态,但这是一个无关紧要的细节) .

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

    【讨论】:

      猜你喜欢
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 2023-03-12
      • 2017-11-14
      • 2012-08-06
      • 2012-05-21
      • 1970-01-01
      相关资源
      最近更新 更多