从Mac OS X上的堆栈溢出中恢复

时间:2009-11-19 12:51:04

标签: c++ macos stack-overflow detection

我正在为我们的产品实现跨平台脚本语言。需要检测并正确处理语言VM中的堆栈溢出情况。在你跳入并确保首先没有堆栈溢出之前,重新读取我的第一句话 - 这是一种脚本语言,最终用户可能会用这种语言编写不正确的程序,这可能会通过例如无尽的堆栈溢出递归。

现在我知道如何在Windows中检测并从堆栈溢出中恢复(参见http://support.microsoft.com/kb/315937)。但是我无法为Mac OS X找到任何解决方案。

VM以C ++实现:Windows上的MSVC ++,Mac OS X上的GCC。

理想情况下,该机制必须基于UNIX功能,因为我们还计划移植到Linux。

感谢。

3 个答案:

答案 0 :(得分:3)

OCaml具有与您相同的约束(程序员可能导致堆栈溢出的“脚本”语言)。它的本机编译器使用系统堆栈进行函数调用 - 就像你一样 - 它处理堆栈溢出(将它们表示为异常)。

如果您没有收到更明确的答案,我建议您查看the OCaml sources中的答案。

~/ppc $ cat >> t.ml

let rec f x = (f x) + (f x) ;;

f 0 ;;

~/ppc $ ocamlopt t.ml
~/ppc $ ./a.out 
Fatal error: exception Stack_overflow

以上是在Mac OS X Leopard上。在源文件中搜索#ifdef HAS_STACK_OVERFLOW_DETECTION

答案 1 :(得分:0)

你不能确定你的程序的最大堆栈大小,堆栈的开始,然后计算堆栈地址的结束?在vm中的每个操作之前,您可以检查堆栈是否会溢出(增加超过最大地址)然后引发异常。 另一种方法是在堆栈结束后写入标识符(如DEADBEEF左右),并在每次堆栈操作后检查它的值。


我仍然不明白为什么你不可能添加检查(这通常是检测到堆栈操作的方式)。但是你仍然可以在stackarea的末尾添加一个硬件断点(写入时)。当它中断时,你知道你有一个stackoverflow。我不会建议它,因为它可能会搞乱你的调试环境。

但基本上 - 如果你有一个VM,你也有读取代码的地方(例如字节码)并编译它/解释它。这是您可以检查标记的位置(与检查堆栈缓冲区溢出的检查相当)。

答案 2 :(得分:0)

看看libsigsegv。它是一个带有例程的C库,可帮助您实现堆栈溢出处理程序等。