3

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

华生博士

在 Windows XP 上,大多数未处理的“结构化异常”(例如访问冲突)会产生一个 Microsoft 应用程序错误报告对话框(它后来被重命名为“Windows 错误报告”,但可执行文件是dwwin.exe,我将称之为 Dr Watson):

沃森博士对话

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

致命应用程序退出

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

致命的应用程序退出

堆栈溢出

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

它可以用main(){main();}


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

AcroRd32.exe - 应用程序错误

此对话框由 拥有csrss.exe,当我看到它时,该AcroRd32.exe进程已退出。

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

应用程序弹出窗口:AcroRd32.exe - 应用程序错误:异常未知软件异常 (0xc0000409) 发生在位置 0x00404def 的应用程序中。

通过对 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。当Windows Explorer窗口带有PDF文件成为活动窗口时,崩溃似乎偶尔发生。

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

4

2 回答 2

0

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

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

于 2018-03-18T01:16:35.103 回答
0

这看起来像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 上的表现,但希望这将为您提供一个起点。

于 2017-03-04T17:03:52.047 回答