Mar*_* Ba 9 winapi unhandled-exception visual-c++ windows-7 windows-error-reporting
注意:我对禁用WER 不感兴趣,我对WER未启动的崩溃场景感兴趣,尽管它应该和Windows"默默地"终止应用程序.
在Windows XP上,编写一个C或C++应用程序(在用户模式下)是非常简单的,它会以这样的方式混淆自己的地址空间,当最终引发访问冲突(或其他未处理的Win32异常)时,Windows XP将会只是默默地终止进程而不通知用户:
...
void stackbreaker() {
    printf("%s\n", __FUNCTION__);
    // global/static buffer
    static char buf[128] = "In a hole in the ground there lived a hobbit. And it burrowed through your stack. It even built a round door into you function.";
    // Get address on the stack
    char local;
    char* stack = &local;
    // nuke the stack:
    memcpy(stack - 64, buf, sizeof(buf));
    // Kaboom. No user defined unhandled exception filter will be called. Stack nuked.
    // Process will terminate silently on Windows XP.
    // But on Windows-7 you still get the WER dialog.
}
...
在一个简单的C++项目中调用上述函数(在发布模式下 - 在测试时注意那些编译器优化 - 而不是在调试器下运行)将:
SetUnhandledExceptionFilter我现在想知道的是 - 在Windows 7下 - 是否已经实现了WER机制,我总是在我的应用程序中获得崩溃[a]的错误对话框,或者即使在Windows 7中是否存在进程损坏情况,这将阻止WER对话框弹出?
我会添加一点读数:
在Windows via C/C++(Richter,Nasarre第5版)一书中,他们描述了"错误过程"(p 711)中发生的事情:
- 异常过滤器.
- ...
- ...
- 内核检测未处理的异常
- 阻止对Wer服务的ALPC调用
- WER报告开始了.
- ...
现在,他们指出Win7与Windows XP的不同之处(引用本书第710页:)
...从Windows Vista开始,该
UnhandledExceptionFilter功能不再向MS'服务器发送错误报告.代替.内核检测到用户模式线程没有处理异常(步骤4)......
因此,这意味着,在Vista及其以上的过程中,"崩溃"的过程完全没有任何办法可以阻止WER进入.我试图确认或反驳这一点.
[a]:显然,通过调用其中一个*exit或多个terminate*函数,可以很容易地"杀死"一个进程而没有任何痕迹.问题是,如果你可以排除这样的终止原因,(怎么样)可能会以一种阻止WER对话框显示的方式在Win7上"崩溃"用户模式进程.
我看了一下我的Windows Internals版本,但它在这个问题上没有太多可说的.在早期版本中,Windows错误报告例程发生在崩溃线程的上下文中.这意味着如果堆栈被删除(如在您的示例中),则可能无法运行.
在Vista及更高版本中,它在崩溃的线程外部运行.此外,内核本身负责在进程崩溃时(通过高级本地过程调用)通知WER.
据Windows Internals称,这些变化解决了消失的流程问题.我只能听取他们的意见.显然,如果WER服务本身已经损坏(或停止),您仍然会发生无声崩溃.
编辑
从Windows Internals,第5版,第122页:
在Windows Vista之前,我们所描述的所有[WER]操作都必须在崩溃线程的上下文中发生......在某些类型的崩溃中......未处理的异常过滤器本身崩溃了.这种"沉默过程死亡"没有记录在任何地方....如果未处理的异常过滤器本身崩溃,Windows Vista及更高版本通过从崩溃的线程外部执行此工作来改进WER机制.
第124页:
...所有Windows进程现在都有一个错误端口,实际上是WER服务注册的ALPC端口对象.内核...将使用此端口向WER服务发送消息,然后WER服务将分析崩溃过程.......这解决了沉默过程死亡的所有问题......