首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么SetUnhandledExceptionFilter不能捕获某些异常,而AddVectoredExceptionHandler可以捕获

为什么SetUnhandledExceptionFilter不能捕获某些异常,而AddVectoredExceptionHandler可以捕获
EN

Stack Overflow用户
提问于 2013-10-29 19:26:02
回答 1查看 19K关注 0票数 29

我遇到了一个问题,当异常代码c0000374引发时,我传递给SetUnhandledExceptionFilter的函数没有被调用。但它与异常代码c0000005一起工作得很好。然后我尝试使用AddVectoredExceptionHandler代替,它没有问题,处理程序函数被正确调用。

是不是API的bug?我可以在任何地方使用AddVectoredExceptionHandler而不是SetUnhandledExceptionFilter吗?

这两个函数都可以与

代码语言:javascript
复制
// Exception code c0000005
int* p1 = NULL;
*p1 = 99;

只有AddVectoredExceptionHandler可以捕获此异常。(为了证明它不依赖于运行时库,我手动引发了异常,它的结果是相同的。)

代码语言:javascript
复制
// Exception code c0000374
RaiseException(0xc0000374, 0, 0, NULL);

测试程序。

代码语言:javascript
复制
#include <tchar.h>
#include <fstream>
#include <Windows.h>

LONG WINAPI VectoredExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo)
{
    std::ofstream f;
    f.open("VectoredExceptionHandler.txt", std::ios::out | std::ios::trunc);
    f << std::hex << pExceptionInfo->ExceptionRecord->ExceptionCode << std::endl;
    f.close();

    return EXCEPTION_CONTINUE_SEARCH;
}

LONG WINAPI TopLevelExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo)
{
    std::ofstream f;
    f.open("TopLevelExceptionHandler.txt", std::ios::out | std::ios::trunc);
    f << std::hex << pExceptionInfo->ExceptionRecord->ExceptionCode << std::endl;
    f.close();

    return EXCEPTION_CONTINUE_SEARCH;
}


int _tmain(int argc, _TCHAR* argv[])
{
    AddVectoredExceptionHandler(1, VectoredExceptionHandler);
    SetUnhandledExceptionFilter(TopLevelExceptionHandler);

    // Exception code c0000374
    RaiseException(0xc0000374, 0, 0, NULL);     

    // Exception code c0000005
    // int* p1 = NULL;
    // *p1 = 99;        


    return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2013-10-29 20:24:48

异常实际上是直接在其源RtlReportCriticalFailure中捕获的,一旦检测到堆损坏,堆管理器就会调用它。在此函数中注册的SEH处理程序调用RtlReportException,紧跟其后的是NtTerminateProcess

我只能得出这样的结论:故意避免使用SEH处理程序--堆损坏时,堆栈内容(以及SEH注册)也是可疑的;而且应用程序无论如何都不能合理地从堆损坏中恢复。

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

https://stackoverflow.com/questions/19656946

复制
相关文章

相似问题

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