什么样的崩溃会在 Windows XP 上产生应用程序错误(又名应用程序弹出窗口)?

Posted

技术标签:

【中文标题】什么样的崩溃会在 Windows XP 上产生应用程序错误(又名应用程序弹出窗口)?【英文标题】:What kind of crash produces an Application Error (aka Application Popup) on Windows XP? 【发布时间】:2015-06-09 10:39:37 【问题描述】:

首先我将描述我所知道的崩溃类型。向下滚动查看实际问题。请注意,我只对 Windows 处理的崩溃感兴趣。特定的应用程序和框架有时有自己的崩溃处理程序(例如 Cygwin、VCL、Java 或 .NET),我不会讨论这些。

华生医生

在 Windows XP 上,大多数未处理的 "Structured Exceptions"(例如访问冲突)会产生 Microsoft 应用程序错误报告对话框(后来改名为“Windows 错误报告”,但可执行文件为 dwwin.exe,我将 call it Dr Watson):

*(char*)0=0;很容易复制

FatalAppExit

调用 FatalAppExit() 会产生 MessageBox 和 Event Log 条目,但不会产生 Dr Watson:

堆栈溢出

在 Windows XP 上,堆栈溢出会导致进程在没有任何通知的情况下毫不客气地退出。 (我认为这从 Vista 开始就已修复)

可以用main()main();转载


我的问题是,是什么原因导致其中之一:

此对话框归csrss.exe 所有,当我看到它时,AcroRd32.exe 进程已经退出。

它还在系统事件日志中写入一个条目(Dr Watson 崩溃不会这样做):

我可以通过调用 MessageBox 来重现对话框和事件日志条目(但显然不是真正的崩溃):

MessageBox(
    0,
    "The exception unknown software exception (0xc0000409) occurred in the application at location 0x00404def.",
    "AcroRd32.exe - Application Error",
    MB_ICONSTOP | MB_SERVICE_NOTIFICATION);

我已排除作为服务运行的 Adob​​e Reader。它是版本 11.0.08。 The crash seems to happen sporadically when a Windows Explorer window with a PDF file selected becomes the active window.

当然,我并不是要您为我排除 Adob​​e Reader 的故障,只是要如何产生“应用程序错误”/“应用程序弹出”类型的崩溃,最好以编程方式进行,这样我就可以了解发生了什么。

【问题讨论】:

仅供参考:0xC0000409STATUS_STACK_BUFFER_OVERRUN。您可以尝试将其传递给NtRaiseHardError,但在 Windows 7 上显示的消息非常不同。 (我目前没有要测试的 Windows XP) 【参考方案1】:

这看起来像是kernel32.UnhandledExceptionFilter 的作品。您可能可以通过以下方式触发此错误消息:

EXCEPTION_RECORD Rec = 
    ExceptionCode : 0xc0000409, /* STATUS_STACK_BUFFER_OVERRUN */
    ExceptionAddress : cast(void*) 0x404def,
;

CONTEXT Ctx;
RtlCaptureContext(&Ctx);

EXCEPTION_POINTERS Xcep = 
    ExceptionRecord : &Rec,
    ContextRecord : &Ctx,
;
UnhandledExceptionFilter(&Xcep);

但是在 Windows 7 上,我并没有这样做,它直接交给了 Watson 博士。

似乎在 W7 上起作用的是:

size_t[2] Params = [
    0xc0000409, /* STATUS_STACK_BUFFER_OVERRUN */
    0x404def, /* exception address */
];

int Response;
NtRaiseHardError(
    0xc0000144 /* STATUS_UNHANDLED_EXCEPTION */ |
        0x10000000 /* HARDERROR_OVERRIDE_ERRORMODE */,
    Params.length,
    0, /* UnicodeStringParameterMask */
    Params.ptr,
    2 /* OptionOkCancel */,
    &Response
);

我知道UnhandledExceptionFilter 在某处有此代码,我只是不知道采用该代码路径需要什么条件。但是你可以自己像这样打电话给NtRaiseHardError

结果如下:

我不再使用 XP,因此您必须自己试验以了解这些方法在 XP 上的表现,但希望这将为您提供一个起点。

【讨论】:

感谢您的回答,但是当我说“以编程方式生产”时,我的意思是意外崩溃,而不是直接调用崩溃处理函数。就我上面的例子而言,*(char*)0=0; 而不是MessageBox(...。我想了解“在事件的自然过程中”导致此类错误对话框的原因。 @HughAllen 嗯,是的,我不知道系统是如何检测到 STACK_BUFFER_OVERRUN 本身的,所以 Adob​​e 可能安装了自己的异常处理程序,或者它是某些特定 C 运行时库的功能.或者可能是一个编译器特性——某种利用缓解模式。【参考方案2】:

当您有未处理的异常时,CSRSS 拥有的错误对话框(也可以通过手动调用 NtRaiseHardError 以编程方式触发,请参阅this answer)在 Windows 上显示。对于所有 Win32 应用程序,未处理异常的默认异常处理程序由 kernel32.dll 设置,该处理程序负责显示 Windows 错误报告对话框或显示错误对话框。

有关详细信息,开源ReactOS 项目(其目的是使用 clean-room RE 以开源方式“重新创建”Windows)具有类似的代码,这应该可以帮助您准确了解哪个条件错误对话框出现:见UnhandledExceptionFilter() function in dll/win32/kernel32/client/except.c。

【讨论】:

以上是关于什么样的崩溃会在 Windows XP 上产生应用程序错误(又名应用程序弹出窗口)?的主要内容,如果未能解决你的问题,请参考以下文章

MFC 应用程序在 NTDLL.dll 中崩溃

MFC 应用程序在 Windows XP 上崩溃

OpenFileDialog 在 Windows XP 下崩溃,但在 Windows 7 下不崩溃

Window 中的 Icon 属性使 Windows XP SP2 中的应用程序崩溃

Windows NT/2000/XP进程与线程之间的关系

在启用 Aero 的 Windows 7 上运行 .NET 2.0 应用程序窗体应用程序会导致菜单交互使应用程序崩溃