2011-08-15 69 views
0

我正在阅读有关替代信号堆栈的Linux程序员手册。堆栈损坏并使用替代信号堆栈

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

我看到SIGALTSTACK()当用户的堆栈被破坏,使用时或当它溢出。我的问题是如何在运行时检测堆栈是否损坏?

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

回答

0

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

即使可以检测到,也无法真正修复损坏的堆栈。不知道在损坏的堆栈上运行代码会造成什么样的损害。因此,无论如何,最好的(可能只有)要做的就是退出。

完全阅读手册页,它使用备用堆栈的原因是很好的(处理SIGSEGV)。虽然你通常无法修复,但戒烟几乎是你能做的唯一事情。

+0

我已经阅读过,但我仍然指出。我明白那个。所以我真的没有看到这个功能的任何意义,仅仅是因为在给定机制的情况下,我只是为了防备为备用堆栈预留内存;可能会或可能不会发生。 –

+0

SIGSEGV处理程序的另一个用途是在内存不足或用尽堆栈情况下获取堆栈跟踪。这是有用的,但只会有效,如果你有一个备用堆栈,并且你的“主”堆栈没有损坏(否则堆栈跟踪是毫无意义的) – Mat

+0

嗨马特,我将不胜感激,如果你可以请回答这个问题 - http:///stackoverflow.com/questions/29761742/examinig-alternate-signal-stack-different-ways-to-allocate-it –