是否有可能在没有获得 Windows 错误报告 (WER) 对话框的情况下使 Windows-7 上的常规用户模式进程崩溃?(何时以及是否正常启用 WER 并且未应用特定标志。)
注意:我对禁用 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++ 项目中调用上述函数(在发布模式下——在测试时注意那些编译器优化——而不是在调试器下运行)将:
- 在 XP 下静默终止进程。
- 在 Windows-7 下显示 WER 崩溃对话框。
- 旁白:在任何情况下,它都不会调用您自己的未处理异常过滤器,即使您设置了一个通过
SetUnhandledExceptionFilter
我现在想知道的是 - 在 Windows 7 下 - WER 机制是否已经以一种方式实现,即我的应用程序中总是会出现崩溃[a]的错误对话框,或者即使在 Windows 7 中是否存在进程损坏情况,这将阻止 WER 对话框弹出?
我将添加一些我所做的阅读:
在Windows via C/C++(Richter, Nasarre 第 5 版)一书中,他们描述了“故障过程”中发生的情况(第 711 页):
- 异常过滤器。
- ...
- ...
- 内核检测到未处理的异常
- 阻止对 Wer 服务的 ALPC 调用
- WER 报告开始。
- ...
现在,他们指出,Win7 的做法与 Windows XP 不同(引用本书第 710 页:)
... 从 Windows Vista 开始,该
UnhandledExceptionFilter
功能不再向 MS 的服务器发送错误报告。反而。内核检测到用户模式线程未处理异常(步骤 4)...
所以这意味着,根本没有办法让进程“崩溃”——在 Vista 及更高版本中——以一种阻止 WER 启动的方式。我试图确认或反驳这一点。
[a]:显然,通过调用各种*exit
或terminate*
函数之一,可以轻松地“杀死”进程而不会留下任何痕迹。问题是,如果您可以排除这种终止原因,(如何)可能以阻止显示 WER 对话框的方式在 Win7 上“崩溃”用户模式进程。