代码之家  ›  专栏  ›  技术社区  ›  Sliq

抓到异常页面是否安全

  •  3
  • Sliq  · 技术社区  · 14 年前

    环境是各种win平台(xp和更高版本)上的vc++9

    我正在编写一个未处理的异常处理程序。我有一个模糊的回忆,从我的内核时代,它是不好的捕捉一个异常守护页面,因为这是生成告诉操作系统扩大堆栈。

    我的问题有两个:

    1. 用户空间中是否会发生此类异常?

    2. 如果是的话,抓住它安全吗?

    我对用它做任何事都不是特别感兴趣。我只想知道我是否需要在 抓住它(因为我现在抓住了一切)。

    γ更新

    我记得我的消息来源,这是陈雷的博客( http://blogs.msdn.com/b/oldnewthing/archive/2006/09/27/773741.aspx )

    我最初担心的是,当捕捉到所有异常时,如果捕捉到异常保护页,可能会阻止操作系统看到异常并扩大堆栈。

    经过进一步思考,我怀疑异常保护页可能在生成它的读/写操作期间在内核中处理,因此永远不会到达我的用户空间代码。

    我想我在找人来证实(或反驳)。

    _第二次更新:__

    我还没有选择答案,因为没有人真正回答这个问题。我会敞开心扉,希望有人能提供我所寻求的信息。

    _第三次更新__

    仍然活在(微弱的)希望中。

    _第四次更新__

    嗯,我从来没有得到一个有用的答案。当我问这个问题的时候,我已经完成了我正在写的模块。我认为,出于实际目的,这个问题是死的。我可能不会再更新了。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Hans Passant    14 年前

    设置页面以生成与VirtualProtectEx()的状态保护页面冲突,并且页面保护标志是 documented procedure . 一个页面只能生成一次异常,因此在处理异常时不会有死亡的危险。

    我没有为这个异常做什么特别的事情,但是这并不能证明太多,得到这个异常是非常罕见的。在我们的事故报告中从没见过。

    这个特性实际上是用来生成堆栈溢出异常的。你真的需要特别处理,因为你只剩下这么少的堆栈。我想这就是你在问题中提到的警告。不过,它永远不会生成页保护异常,在转换为堆栈溢出之前,将在内核级别处理该异常。

        2
  •  1
  •   Jeremy    12 年前

    根据我对virtualquery的观察,它类似于内核模式的情况。如果访问的保护页堆栈不属于访问线程,则调试器可以捕获异常。无论如何,你应该已经有了答案。

        3
  •  0
  •   egrunin    14 年前

    根据 MSDN :

    线程访问分配的内存 使用页保护修饰符。

    这听起来像是除非你有一个bug,否则永远不会发生的事情;所以我会相应地处理它。

    编辑

    操作系统异常处理程序是在您之前注册的,因此您自己处理它并不意味着操作系统没有首先看到它。