Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从Mac OS X上的堆栈溢出恢复_C++_Macos_Stack Overflow_Detection - Fatal编程技术网

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

C++ 从Mac OS X上的堆栈溢出恢复,c++,macos,stack-overflow,detection,C++,Macos,Stack Overflow,Detection,我正在为我们的产品实现一种跨平台脚本语言。在VM语言中,需要检测并正确处理堆栈溢出情况。在你跳进去说“首先确保没有堆栈溢出”之前,请重新阅读我的第一句话——这是一种脚本语言,最终用户可能会用这种语言编写不正确的程序,这可能会通过无休止的递归使堆栈溢出 现在我知道了如何在Windows中检测堆栈溢出并从中恢复(请参阅)。然而,我无法找到任何解决方案的Mac OS X VM在Windows上用C++:MSVC++实现,在Mac OS X上用GCC实现 理想情况下,该机制必须基于UNIX功能,因为我们

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

现在我知道了如何在Windows中检测堆栈溢出并从中恢复(请参阅)。然而,我无法找到任何解决方案的Mac OS X

VM在Windows上用C++:MSVC++实现,在Mac OS X上用GCC实现

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


谢谢。

OCaml具有与您相同的约束(“脚本”语言,程序员可能会导致堆栈溢出)。它的本机编译器使用系统堆栈进行函数调用——正如您所做的那样——并处理堆栈溢出(将其具体化为异常)

如果你没有得到一个更明确的答案,我建议你看看这是怎么做的


以上是在Mac OS X Leopard上。搜索源文件中的
#如果DEF有堆栈溢出检测

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


我仍然不明白为什么不能添加检查(这就是通常检测堆栈操作的方式)。但是您仍然可以在堆栈区域的末尾添加一个硬件断点(在写入时)。当它破裂时,你知道你有一个堆栈溢出。但我不建议这样做,因为它可能会扰乱您的调试环境


但基本上-如果你有一个虚拟机,你也有一个地方,读取代码(例如字节码)和编译/解释它。这是您可以检查标记的地方(与检测堆栈缓冲区溢出的检查类似)。

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

“从堆栈溢出中恢复”让我觉得您因为在这里花费太多时间而丢掉了工作<代码>:)您是被迫将进程堆栈用作VM堆栈,还是您的VM实现了自己的堆栈?恐怕这是不可能的。在“每个操作”之前没有集中的检查位置,在每个VM操作和运行库函数实现中添加检查是不实际的。我需要能够检测到进程堆栈溢出,捕获它并释放堆栈,并输出我们自己的运行时错误消息。您仍然可以像无堆栈python一样工作。Stackless python有一个堆栈,但它是位于堆中的vm对象。按照它的实现方式,只有当内存耗尽时,才会耗尽堆栈。OCaml源代码非常有用。我已经能够使用OCaml使用的SIGSEGV信号技术捕获堆栈溢出。Unfortuntely OCaml是用C编写的,不使用C++异常处理。我的VM是用C++编写的,当堆栈溢出发生时,我需要抛出C++异常来正确地解压堆栈。在栈解卷时,从SigSeSv信号处理程序中抛出C++异常的尝试是导致进程崩溃的原因。显然,退绕过程不能从信号处理器内部发生。不管怎样,谢谢你的指针,我对你的答案投了赞成票。@TN:信号处理程序是异步调用的,你可以从中做的很少。主要是可以设置一个定期检查的标志。
~/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