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

时间:2015-04-04 14:16:14

标签: crash windows-xp event-log application-error drwatson

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

沃森博士

在Windows XP上,大多数未处理的"Structured Exceptions"(例如访问冲突)会生成Microsoft应用程序错误报告对话框(稍后将其重命名为“Windows错误报告”,但可执行文件为dwwin.exe,我将{{3} }}):

Dr Watson dialog

可以使用*(char*)0=0;

轻松复制

FatalAppExit

调用FatalAppExit()会生成一个MessageBox和Event Log条目,但没有Watson博士:

Fatal Application Exit

堆栈溢出

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

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

复制

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

AcroRd32.exe - Application Error

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

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

Application popup: AcroRd32.exe - Application Error : The exception unknown software exception (0xc0000409) occurred in the application at location 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);

我排除了Adobe Reader作为服务运行。它是版本11.0.08。当选择了PDF文件的Windows资源管理器窗口成为活动窗口时,似乎偶尔会发生崩溃。

当然我不是要求你为我排除Adobe Reader故障,只是如何产生“应用程序错误”/“应用程序弹出”类型的崩溃,最好是以编程方式,以便我能够理解正在发生的事情。

2 个答案:

答案 0 :(得分: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

结果如下:

enter image description here

我不再使用XP了,所以你必须自己试验一下这些方法在XP上的行为,但希望这会给你一个起点。

答案 1 :(得分:0)

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

有关详细信息,开源ReactOS项目(目的是"使用洁净室RE以开源方式重新创建" Windows)具有类似的代码,应该帮助您准确了解错误对话框出现的条件:请参阅UnhandledExceptionFilter() function in dll/win32/kernel32/client/except.c

相关问题