【问题标题】:Mixing Win32 SEH with heap-allocated stack frames将 Win32 SEH 与堆分配的堆栈帧混合
【发布时间】:2010-03-01 16:03:49
【问题描述】:

有没有办法在不削弱 SEH 的情况下摆脱 Win32 的“一大堆”模型?我希望能够在堆上分配堆栈帧,作为实现协程的一种方式。但是,我的代码目前依赖于 SEH,并且在几页之后,this article 说(与异常处理程序的遍历、扫描、强调我的有关):

操作系统在此链遍历期间对损坏的堆栈非常偏执。它检查所有链条目是否在堆栈范围内。 (这些界限也记录在 TEB 中)。操作系统还会检查堆栈上的所有条目是否按升序。如果您违反这些规则,操作系统将认为堆栈已损坏并且将无法处理异常。这是 Win32 应用程序无法将其堆栈拆分为多个不相交的段作为处理堆栈溢出的创新技术的原因之一。

所以基本上,如果当前堆栈帧在“一个大堆栈”之外时发生异常,则该进程将立即终止。不理想的行为。

有没有人能够解决这个问题并在本机 Win32 应用程序中使用带有不相交堆栈的 SEH?此外,是否还有任何其他 Win32 特定的“陷阱”具有不相交的堆栈?

【问题讨论】:

    标签: winapi seh


    【解决方案1】:

    Win32 专门添加了光纤来支持这一点。开始阅读here... 并查看此警告blog post

    【讨论】:

    • 我认为光纤是一种解决方案,但不幸的是,Raymond 的博客条目中列出的许多警告(尤其是关于在光纤之外传播的异常的点)使它们对我来说无法使用。此外,据我所知,它们的用途与协程不同(尽管看起来很相似),这就是所有限制的来源。见:blogs.msdn.com/larryosterman/archive/2005/01/05/347314.aspx
    • Fibers 是专门为支持协程而设计的。没有其他捕鼠器了,也许您应该根据纤维可以给您的要求来调整您的要求。
    猜你喜欢
    • 2011-10-06
    • 1970-01-01
    • 2014-10-26
    • 2011-05-28
    • 2011-09-06
    • 2013-10-20
    • 2010-10-03
    • 2023-03-03
    相关资源
    最近更新 更多