C++ 捕捉异常保护页面安全吗
环境是各种Win平台(XP和更高版本)上的VC++9 我正在编写一个未处理的异常处理程序。在内核时代,我模糊地记得捕获异常保护页面是不好的,因为生成该页面是为了告诉操作系统扩大堆栈 我的问题有两个:C++ 捕捉异常保护页面安全吗,c++,exception,winapi,C++,Exception,Winapi,环境是各种Win平台(XP和更高版本)上的VC++9 我正在编写一个未处理的异常处理程序。在内核时代,我模糊地记得捕获异常保护页面是不好的,因为生成该页面是为了告诉操作系统扩大堆栈 我的问题有两个: 这样的异常会在用户空间中发生吗 如果是这样,抓住它安全吗 我对用它做任何事都不是特别感兴趣。我只是想知道我是否需要把特殊的代码放进去而不去捕捉它(因为我现在正在捕捉所有的东西) \uuuuu更新:\uuuuu 我记得我的消息来源,是陈雷蒙的博客() 我最初担心的是,在捕获所有异常时,如果捕获异常保护
操作系统异常处理程序是在您的异常处理程序之前注册的,因此自己处理异常处理程序并不意味着操作系统没有先看到异常处理程序。使用VirtualProtectEx()设置页面以生成状态\u GUARD\u page\u违例,并且页面\u GUARD标志是。一个页面只能生成一次异常,因此在处理异常时不会有死亡的危险 我没有为异常做任何特殊的事情,但这并不能证明太多,得到这个异常是非常罕见的。在我们的坠机报告中从未见过它
该功能实际上是用于生成堆栈溢出异常。因为剩下的堆栈太少,所以确实需要特别处理。我想这就是你在问题中提到的警告的来源。但是,它永远不会生成页面保护异常,在转换为堆栈溢出之前,会在内核级别处理该异常。根据我对virtualquery的观察,它与内核模式的情况类似。如果访问的保护页堆栈不属于访问线程,则调试器可以捕获异常。无论如何,您应该已经有了答案。堆栈中的最后一页具有“保护页”属性。当您访问它时,它会生成一个异常以警告操作系统扩大堆栈。至少,内核模式下会发生这种情况。不确定它在用户空间中是如何工作的。Windows不会自动放大堆栈。克里斯托弗——是的。阅读我链接到的Raymond Chen文章。实际上,在内核模式下,您不需要处理它。你让它通过操作系统,它扩大了堆栈。如果捕获到它,操作系统将看不到它,堆栈将永远不会被放大,并且会发生堆栈溢出。我的问题是它是否可以在用户模式下生成。我的猜测是“否”,但我一直在寻求确认。询问并回答:“但它永远不会生成页面保护异常,这是在内核级别处理的”。您能再解释一下吗?我不太明白你的意思。您可能可以确定特定页面是否具有“guard page”属性,但如何使用VirtualQuery()检测其异常行为?我还没有看到在用户模式下抛出异常\保护\页面异常,但我可能没有成功地耗尽堆栈内存来触发一个异常。