- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我遇到了一个问题,我传递给 SetUnhandledExceptionFilter 的函数当异常代码 c0000374 引发时没有被调用。但它适用于异常代码 c0000005。然后我尝试使用 AddVectoredExceptionHandler相反,它没有问题,处理函数被正确调用。
是 API 错误吗?我可以到处使用 AddVectoredExceptionHandler 而不是 SetUnhandledExceptionFilter 吗?
这两个函数都可以正常工作
// Exception code c0000005
int* p1 = NULL;
*p1 = 99;
只有 AddVectoredExceptionHandler 可以捕获此异常。 (为了证明它不依赖于运行时库,我手动引发了异常,结果是一样的。)
// Exception code c0000374
RaiseException(0xc0000374, 0, 0, NULL);
测试程序。
#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;
}
最佳答案
这是因为 MSVC CRT 启动中的这段代码:
/*
* Enable app termination when heap corruption is detected on
* Windows Vista and above. This is a no-op on down-level OS's
* and enabled by default for 64-bit processes.
*/
if (!_NoHeapEnableTerminationOnCorruption)
{
HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
}
如果您想禁用它(不推荐),请将 nohetoc.obj
链接到您的程序。
关于c++ - 为什么 SetUnhandledExceptionFilter 无法捕获某些异常但 AddVectoredExceptionHandler 可以,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19656946/
每当我的代码生成结构化异常时,我都会使用以下代码创建一个小型转储文件: void CreateMiniDump( EXCEPTION_POINTERS* pep ) { // Open the f
当发生未处理的异常时,我想打印堆栈跟踪而不是仅仅终止。我尝试使用 SetUnhandledExceptionFilter 来做到这一点: SetUnhandledExceptionFilter(Unh
我想让我的代码为未处理的异常创建转储。 我曾想过使用 SetUnhandledExceptionFilter。但是 SetUnhandledExceptionFilter 可能无法按预期工作的情况是什
Some resources似乎建议而不是使用 SetUnhandledExceptionFilter 要捕获未处理的异常,可以使用 AddVectoredExceptionHandler 通知所有异
我使用 SetUnhandledExceptionFilter 设置了一个异常处理程序,它工作正常。但是,如果我从 OpenMP 代码中抛出异常,我会看到标准的“应用程序崩溃”窗口并且不会调用处理程序
我正在做一个项目来增强我们的生产调试能力。我们的目标是在任何未处理的异常上可靠地生成小型转储,无论异常是托管的还是非托管的,以及它是发生在托管线程还是非托管线程上。 我们使用优秀的ClrDump目前这
我遇到了一个问题,我传递给 SetUnhandledExceptionFilter 的函数当异常代码 c0000374 引发时没有被调用。但它适用于异常代码 c0000005。然后我尝试使用 AddV
我是一名优秀的程序员,十分优秀!