首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么类型的崩溃会在Windows上产生应用程序错误(也称为应用程序弹出)?

什么类型的崩溃会在Windows上产生应用程序错误(也称为应用程序弹出)?
EN

Stack Overflow用户
提问于 2015-04-04 14:16:14
回答 2查看 1.6K关注 0票数 3

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

沃森博士

在Windows上,大多数未处理的“结构性例外” (例如访问冲突)会产生一个对话框(它后来被重新命名为“dwwin.exe错误报告”,但可执行文件是dwwin.exe和I will http://blogs.msdn.com/b/oldnewthing/archive/2005/08/10/449866.aspx):

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

FatalAppExit

调用FatalAppExit()会生成一个MessageBox和事件日志条目,但没有Dr Watson:

堆栈溢出

在Windows上,堆栈溢出会导致进程在没有任何通知的情况下随意退出。(我认为这是从Vista开始的)

它可以用main(){main();}复制。

我的问题是,是什么原因造成了这样的情况:

这个对话框属于csrss.exe,当我看到它时,AcroRd32.exe进程已经退出。

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

通过调用MessageBox,我可以再现对话框和事件日志条目(但显然不是实际的崩溃):

代码语言:javascript
复制
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作为服务运行的可能性。它是11.0.08版。当选择PDF文件的Windows窗口成为活动窗口时,崩溃似乎是偶然发生的。

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

EN

回答 2

Stack Overflow用户

发布于 2017-03-04 17:03:52

这看起来像kernel32.UnhandledExceptionFilter的工作。可能会在以下情况下触发此错误消息:

代码语言:javascript
复制
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上没有为我做这件事,它只是直接去了沃森博士。

在W7上似乎起作用的是:

代码语言:javascript
复制
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上是如何运行的,但希望这将给您一个起点。

票数 0
EN

Stack Overflow用户

发布于 2018-03-18 01:16:35

当您有未处理的异常时,CSRSS拥有的错误对话框(也可以通过手动调用NtRaiseHardError (参见这个答案)以编程方式触发)显示在Windows上。对于所有Win32应用程序,kernel32.dll为未处理异常设置一个默认异常处理程序,这个处理程序负责显示Windows Reporting对话框或显示错误对话框。

关于细节,开源ReactOS项目(其目的是以开放源码的方式使用干净的RE重新创建Windows )具有类似的代码,这将帮助您准确地了解错误对话框出现的条件:请参阅UnhandledExceptionFilter()函数在dll/win32 32/kernel32 32/client/upept.c中

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29447445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档