c++ - 捕获 EXCEPTION_GUARD_PAGE 是否安全

标签 c++ exception winapi

各种 Win 平台(XP 及更高版本)上的环境为 VC++ 9

我正在编写一个未处理的异常处理程序。我在内核时代有一个模糊的记忆,那就是捕获 EXCEPTION_GUARD_PAGE 是很糟糕的,因为生成它是为了告诉操作系统扩大堆栈。

我的问题有两个:

  1. 用户空间会不会出现这样的异常?

  2. 如果是这样,捕获它安全吗?

我对用它做任何事情都不是特别感兴趣。我只是想知道是否需要将特殊代码放入 捕获它(因为我现在正在捕获所有内容)。

更新:

我想起来我的出处了,是陈峰的博客(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/

相关文章:

c++ - OSX Yosemite 10.10.3 上的 Cmake - GLEW : package 'gl' not found

c++ - 在 Visual Studio 中使用自制库

java - Java 中的 OurCompanyRuntimeException 类型有什么意义?

winapi - Win32 : Write to file without buffering?

c++ - 是否可以在 Win32 编辑控件中突出显示文本?

c++ - 计算对象的引用

c++ - 链接错误在 32 位 XP 机器上构建 64 位 Qt 应用程序

java - Selenium try/catch 点击似乎需要很长时间?

c++ - 读取文件抛出异常

c++ - DirectShow 通用媒体解码器