如何在程序的死亡痛苦中分配更多堆栈?

时间:2016-07-12 13:42:07

标签: c stack-overflow

在Posix系统上,我使用sigaction编码信号处理程序。

我想在调用exit()之前记录一些调试信息。这涉及一些程序调用。

如果我们有堆栈溢出,有没有办法让我可以进行这些函数调用而不会进一步搞乱?

我知道在我调试之后,我会打电话给exit(),所以我们永远不会解开堆栈。我可以编写一个小的汇编器插件来将堆栈指针设置为堆栈的基础吗?

别介意我在捣乱它;它以后不再需要,并且通过废弃堆栈的开头,我不会在它结束之前捣乱。

有没有人这样做过,或是替代方案,并证明它有效?

2 个答案:

答案 0 :(得分:4)

在POSIX上,您可以为sigaltstack()的特定信号处理程序设置单独的堆栈。 Linux上用于此功能的联机帮助页非常好:

  

备用信号堆栈的最常见用法是处理   SIGSEGV          如果可用于正常过程的空间,则生成的信号          堆栈耗尽:在这种情况下,SIGSEGV的信号处理程序不能          在进程堆栈上调用;如果我们想处理它,我们必须使用          备用信号堆栈。

要记住的一件事是你需要使用sigaction()而不是signal()来建立相关的信号处理程序,但无论如何这都是个好主意。此外,sa_flags sigaction()的{​​{1}}需要包含struct sigaction

答案 1 :(得分:1)

您的程序不需要使用堆栈(对于callframes,而不是数据结构)。作为一种图灵完备的编程语言,您可以将任何功能递归循环(例如使用函数调用的循环)重写为程序递归循环(例如{{1}等过程循环}},forwhile),为您提供适当的语言和数据结构。

您可能会发现使用do .. while增加堆栈(数据结构,与呼叫帧不同)到几千兆字节是微不足道的......作为额外的奖励,您将不再需要深入研究非便携式黑客攻击,例如实现定义的汇编程序符号或信号。