gpt4 book ai didi

delphi - Delphi 中的保护页异常?

转载 作者:行者123 更新时间:2023-12-03 14:56:35 24 4
gpt4 key购买 nike

有一篇 Raymond Chen 的帖子,其中 he tells how bad IsBadXxxPtr function is by eating guard page exception .

我不太明白它是如何应用到Delphi中的。通常应由谁以及如何(即不调用 IsBadXxxPtr)处理此异常?我确实知道 Delphi 插入了一段代码,该代码(例如)访问大型静态数组的内存 - 正是出于这个原因:扩展堆栈。

但是如果引发保护页异常:谁将在 Delphi 应用程序中处理它?难道我不会以不恰当的方式使用 try/except 不小心弄乱它吗? Delphi 的调试器会通知我这些异常吗?

最佳答案

Windows 结构化异常处理 (SEH) 具有两阶段结构。当异常发生时,Windows首先通过注册的异常处理程序链(其头部存储在x86上的fs:[0]中,即FS段指向的段中的第一个双字)来查找异常的处理程序寄存器 - 所有那些丑陋的 16 位段偏移逻辑并没有在 32 位中消失,只是变得不那么相关了)。

通过调用具有特定标志的函数来完成搜索,该标志的指针存储在堆栈上的每个异常帧中。 fs:[0] 指向最上面的帧。每个帧都指向前一帧。最终,列表中的最后一帧是由操作系统提供的(如果未处理的异常到达此处理程序,该处理程序将弹出一个应用程序崩溃对话框)。

这些函数通常检查异常的类型,并返回一个代码来指示要做什么。可以返回的代码之一基本上是“忽略此异常并继续”。如果 Windows 看到这一点,它将重置指令指针到异常点并恢复执行。另一个代码指示此异常框架应该处理给定的异常。第三个代码是“我不会捕获此异常,继续搜索”。 Windows 继续调用这些异常过滤器函数,直到找到一个可以以某种方式处理异常的函数。

如果 Windows 找到一个通过捕获异常来处理异常的函数,那么它将继续将堆栈展开回该处理程序,这包括再次调用所有函数,仅传递不同的标志。此时,函数执行finally 逻辑,直到处理程序执行 except 逻辑。

但是,对于堆栈页防护异常,过程有所不同。该语言的异常处理程序都不会选择处理此异常,因为否则堆栈增长机制将被破坏。相反,过滤器搜索一路过滤到操作系统提供的基本异常处理程序,该处理程序通过提交适当的内存来增加堆栈分配,然后返回适当的返回代码以指示操作系统应从中断处继续,而不是展开堆栈。

该工具和调试基础设施旨在让这些特定异常正确发挥作用,因此您无需担心如何处理它们。

您可以在Matt Pietrek's excellent article in MSJ from over a decade ago中阅读有关SEH的更多信息。 .

关于delphi - Delphi 中的保护页异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/765162/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com