Windows堆栈保护页面未在_chkstk中触发

时间:2014-11-03 05:38:28

标签: winapi memory

我在“狂野”中看到了一些崩溃,其中崩溃转储显示代码在尝试扩展堆栈时在_chkstk中抛出访问冲突。 Windbg显示_chkstk正在触及防护页面,但是它不应该扩展堆栈,而只是抛出访问冲突。

我怀疑这可能是由于代码中的用户模式结构化异常处理程序,但我的测试表明,在正常情况下,_chkstk防护页面异常发生在内核模式下,甚至从未到达用户模式异常处理程序。

因此,在这种情况下,看起来内核模式防护页面异常由于某种原因没有被处理,而是触发了用户模式访问冲突。

可能导致这种情况发生的原因是什么?

1 个答案:

答案 0 :(得分:1)

这结果是XP / Server 2003内核特定问题。在那些操作系统上,如果一个线程读取另一个线程堆栈,那么防护页面和TIB状态就会搞砸,任何后续尝试增加堆栈(_chkstk)都会导致访问冲突。这不会发生在以后的操作系统上。

在我们的例子中,我们写出了一个包含线程堆栈的进程内minidump,它会破坏堆栈状态,如dbghelp库读取每个线程堆栈时所述。<​​/ p>

故事的寓意是生成进程中的小型转储不安全,它们应始终由外部进程生成。