【发布时间】:2010-03-01 16:03:49
【问题描述】:
有没有办法在不削弱 SEH 的情况下摆脱 Win32 的“一大堆”模型?我希望能够在堆上分配堆栈帧,作为实现协程的一种方式。但是,我的代码目前依赖于 SEH,并且在几页之后,this article 说(与异常处理程序的遍历、扫描、强调我的有关):
操作系统在此链遍历期间对损坏的堆栈非常偏执。它检查所有链条目是否在堆栈范围内。 (这些界限也记录在 TEB 中)。操作系统还会检查堆栈上的所有条目是否按升序。如果您违反这些规则,操作系统将认为堆栈已损坏并且将无法处理异常。这是 Win32 应用程序无法将其堆栈拆分为多个不相交的段作为处理堆栈溢出的创新技术的原因之一。
所以基本上,如果当前堆栈帧在“一个大堆栈”之外时发生异常,则该进程将立即终止。不理想的行为。
有没有人能够解决这个问题并在本机 Win32 应用程序中使用带有不相交堆栈的 SEH?此外,是否还有任何其他 Win32 特定的“陷阱”具有不相交的堆栈?
【问题讨论】: