向量异常处理程序使用什么堆栈(Windows)?

时间:2015-10-15 15:10:45

标签: c windows

我有一种玩具编程语言,它为每个协同程序/光纤/线程使用单独的堆栈。最初通过Windows上的VirtualAlloc使用MEM_RESERVE分配堆栈,以减少已提交的内存。我添加了一个向量异常处理程序,用于捕获堆栈增长时发生的页面错误,并使用MEM_COMMIT在这些页面上再次调用VirtualAlloc。

我遇到的问题是我的向量异常处理程序(通过AddVectoredExceptionHandler设置)没有运行。我怀疑这是由于双栈错误造成的。理论上该程序用完MEM_COMMIT堆栈,并启动异常处理程序。由于异常处理程序使用相同的堆栈(可能?),它也会立即出现故障,因此永远不会运行。

那么,处理程序是否使用与出现故障的协同程序/光纤相同的堆栈?有没有办法让向量异常处理程序使用特殊堆栈? (在类Unix系统上,我为此目的使用sigaltstack。)

1 个答案:

答案 0 :(得分:1)

阅读VC2008文档:

  

向量异常处理

     

向量处理程序不是基于框架的,因此,无论您在调用框架中的哪个位置,都可以添加将被调用的处理程序。

"无论你在呼叫框架中的哪个位置"让我期望异常处理程序使用当前堆栈(sp寄存器)。

为了确保在#34之前保留一些空间,程序用完了MEM_COMMIT堆栈"允许处理程序使用堆栈,并使用调试器检查汇编程序的指令序列和寄存器。