堆栈损坏和使用备用信号堆栈

时间:2011-08-15 08:15:36

标签: linux-kernel stack signals

我正在阅读关于替代信号堆栈的Linux程序员手册。

http://www.kernel.org/doc/man-pages/online/pages/man2/sigaltstack.2.html

我看到当用户的堆栈损坏或溢出时使用了sigaltstack()。我的问题是如何在运行时检测堆栈是否已损坏?

在我正在运行的生产程序中,我想去替代信号堆栈,如果我的程序检测到,堆栈被破坏了。这是正确的问题吗?一些线程中的人们谈论使用像Valgrind(以及可能还有其他人)这样的调试工具,但不幸的是,奢侈品在生产中是不可用的。

1 个答案:

答案 0 :(得分:0)

你无法从进程本身真正检测到损坏的堆栈 - 一旦你的堆栈损坏,整个程序(包括你可以尝试用来检测损坏的任何函数/变量)都是不可预测的。

即使您可以检测到它,也无法真正修复损坏的堆栈。没有人知道在损坏的堆栈上运行代码会造成什么样的损害。因此,最好的(可能是唯一的)事情就是在那时退出。

完全阅读手册页,它给出使用备用堆栈的原因是一个很好的(处理SIGSEGV)。虽然你通常也不能修复它,所以退出几乎是你唯一可以做的事情。