在Posix系统上,我使用sigaction编码信号处理程序。
我想在调用exit()
之前记录一些调试信息。这涉及一些程序调用。
如果我们有堆栈溢出,有没有办法让我可以进行这些函数调用而不会进一步搞乱?
我知道在我调试之后,我会打电话给exit()
,所以我们永远不会解开堆栈。我可以编写一个小的汇编器插件来将堆栈指针设置为堆栈的基础吗?
别介意我在捣乱它;它以后不再需要,并且通过废弃堆栈的开头,我不会在它结束之前捣乱。
有没有人这样做过,或是替代方案,并证明它有效?
答案 0 :(得分:4)
在POSIX上,您可以为sigaltstack()
的特定信号处理程序设置单独的堆栈。 Linux上用于此功能的联机帮助页非常好:
备用信号堆栈的最常见用法是处理 SIGSEGV 如果可用于正常过程的空间,则生成的信号 堆栈耗尽:在这种情况下,SIGSEGV的信号处理程序不能 在进程堆栈上调用;如果我们想处理它,我们必须使用 备用信号堆栈。
要记住的一件事是你需要使用sigaction()
而不是signal()
来建立相关的信号处理程序,但无论如何这都是个好主意。此外,sa_flags
sigaction()
的{{1}}需要包含struct sigaction
。
答案 1 :(得分:1)
您的程序不需要使用堆栈(对于callframes,而不是数据结构)。作为一种图灵完备的编程语言,您可以将任何功能递归循环(例如使用函数调用的循环)重写为程序递归循环(例如{{1}等过程循环}},for
和while
),为您提供适当的语言和数据结构。
您可能会发现使用do .. while
增加堆栈(数据结构,与呼叫帧不同)到几千兆字节是微不足道的......作为额外的奖励,您将不再需要深入研究非便携式黑客攻击,例如实现定义的汇编程序符号或信号。