::SetUnhandledExceptionFilter(ExceptionFilter); 是 Windows 编程中用于设置顶层未处理异常过滤器的关键 API 调用。它属于 Windows 结构化异常处理(SEH, Structured Exception Handling)机制的一部分,主要用于捕获那些未被程序内部处理的异常(如内存访问违规、除零错误等)。以下是详细说明:
LPTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(
LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
);
参数 lpTopLevelExceptionFilter:指向用户自定义的异常处理函数的指针。
返回值:旧的顶层异常过滤器函数指针(可保存以便后续恢复)。
当程序发生未处理的异常(如崩溃)时,系统会调用通过 SetUnhandledExceptionFilter 注册的异常处理函数,而不是弹出默认的 Windows 错误对话框(如“程序已停止工作”)。
开发者可以在自定义的 ExceptionFilter 函数中实现以下操作:
自定义异常处理函数需符合以下签名:
LONG WINAPI ExceptionFilter(_EXCEPTION_POINTERS* pExceptionInfo);
#include
#include // 需要链接 DbgHelp.lib
// 自定义异常处理函数
LONG WINAPI MyExceptionFilter(_EXCEPTION_POINTERS* pExceptionInfo) {
// 生成 MiniDump 文件
HANDLE hFile = CreateFile(L"crash.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE) {
MINIDUMP_EXCEPTION_INFORMATION dumpInfo = {0};
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ExceptionPointers = pExceptionInfo;
dumpInfo.ClientPointers = FALSE;
MiniDumpWriteDump(
GetCurrentProcess(),
GetCurrentProcessId(),
hFile,
MiniDumpNormal,
&dumpInfo,
NULL,
NULL
);
CloseHandle(hFile);
}
return EXCEPTION_EXECUTE_HANDLER; // 终止程序
}
int main() {
// 设置全局异常过滤器
::SetUnhandledExceptionFilter(MyExceptionFilter);
// 此处可能触发崩溃的代码(示例)
int* p = nullptr;
*p = 42; // 触发访问违规异常
return 0;
}
某些场景下(如后台服务程序),需禁止弹出系统错误对话框:
// 返回 EXCEPTION_EXECUTE_HANDLER 直接终止程序,不弹窗
SetUnhandledExceptionFilter(MyExceptionFilter);
SetUnhandledExceptionFilter 是进程全局的,需确保在程序初始化时设置一次,避免多线程竞争。
某些库(如某些 C++ 运行时、防病毒软件)可能会覆盖你的异常过滤器。可在关键位置(如主循环)重复设置。
#include
#include
#pragma comment(lib, "DbgHelp.lib")
LONG WINAPI MyExceptionFilter(_EXCEPTION_POINTERS* pExceptionInfo) {
HANDLE hFile = CreateFile(L"CrashDump.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE) {
MINIDUMP_EXCEPTION_INFORMATION dumpInfo = {0};
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ExceptionPointers = pExceptionInfo;
dumpInfo.ClientPointers = FALSE;
MiniDumpWriteDump(
GetCurrentProcess(),
GetCurrentProcessId(),
hFile,
MiniDumpWithFullMemory, // 包含完整内存信息
&dumpInfo,
NULL,
NULL
);
CloseHandle(hFile);
}
return EXCEPTION_EXECUTE_HANDLER;
}
int main() {
SetUnhandledExceptionFilter(MyExceptionFilter);
// 触发崩溃的示例代码
volatile int* p = nullptr;
*p = 42;
return 0;
}
::SetUnhandledExceptionFilter(ExceptionFilter); 是 Windows 程序中捕获未处理异常的核心工具,常用于:
使用时需注意异常处理函数的可靠性、线程安全性和潜在覆盖问题。对于复杂项目,建议结合 Vectored Exception Handling 或第三方崩溃报告库(如 Google Breakpad)。