各种 Win 平台(XP 及更高版本)上的环境为 VC++ 9
我正在编写一个未处理的异常处理程序。我在内核时代有一个模糊的记忆,那就是捕获 EXCEPTION_GUARD_PAGE 是很糟糕的,因为生成它是为了告诉操作系统扩大堆栈。
我的问题有两个:
用户空间会不会出现这样的异常?
如果是这样,捕获它安全吗?
我对用它做任何事情都不是特别感兴趣。我只是想知道是否需要将特殊代码放入 不 捕获它(因为我现在正在捕获所有内容)。
更新:
我想起来我的出处了,是陈峰的博客(http://blogs.msdn.com/b/oldnewthing/archive/2006/09/27/773741.aspx)
我最初担心的是,当捕获所有异常时,如果我捕获了 EXCEPTION_GUARD_PAGE,我可能会阻止操作系统看到异常并扩大堆栈。
进一步思考,我怀疑 EXCEPTION_GUARD_PAGE 可能在生成它的读/写操作期间在内核中处理,因此永远不会到达我的用户空间代码。
我想我正在找人来证实(或反驳)这一点。
第二次更新:
我还没有选择答案,因为没有人真正回答过这个问题。我将打开它,希望有人可以提供我寻求的信息。
第三次更新
仍然生活在(微弱的)希望中。
第四次更新
好吧,我从来没有得到可用的答案。当我问这个问题时,我已经完成了我正在编写的模块。我认为,出于实际目的,这个问题已经死了。我可能不会再更新了。
最佳答案
设置页面以使用 VirtualProtectEx() 生成 STATUS_GUARD_PAGE_VIOLATION 并且 PAGE_GUARD 标志是 documented procedure .异常只能为一个页面生成一次,因此您在处理异常时不会有死亡的危险。
我没有为异常做任何特别的事情,但这并不能证明太多,得到这个异常是非常罕见的。在我们的任何崩溃报告中从未见过一次。
该功能实际上是为了产生堆栈溢出异常。你真的需要特别处理,因为你剩下的堆栈很少。我认为这就是您在问题中提到的警告的来源。然而,它永远不会生成页面保护异常,在将其转换为堆栈溢出之前在内核级别进行处理。
关于c++ - 捕获 EXCEPTION_GUARD_PAGE 是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3058527/