详细说明windows系统函数::SetUnhandledExceptionFilter(ExceptionFilter)

::SetUnhandledExceptionFilter(ExceptionFilter); 是 Windows 编程中用于设置顶层未处理异常过滤器的关键 API 调用。它属于 Windows 结构化异常处理(SEH, Structured Exception Handling)机制的一部分,主要用于捕获那些未被程序内部处理的异常(如内存访问违规、除零错误等)。以下是详细说明:

1.函数原型

LPTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
);
  • 参数 lpTopLevelExceptionFilter:指向用户自定义的异常处理函数的指针。

  • 返回值:旧的顶层异常过滤器函数指针(可保存以便后续恢复)。

2.核心作用

2.1 全局异常捕获

当程序发生未处理的异常(如崩溃)时,系统会调用通过 SetUnhandledExceptionFilter 注册的异常处理函数,而不是弹出默认的 Windows 错误对话框(如“程序已停止工作”)。

2.2 自定义崩溃处理

开发者可以在自定义的 ExceptionFilter 函数中实现以下操作:

  • 记录崩溃信息(如调用栈、寄存器状态)。
  • 生成 MiniDump 文件(用于后续调试)。
  • 执行紧急数据保存或资源释放。
  • 上传错误报告到服务器。

3.参数 ExceptionFilter 的实现

自定义异常处理函数需符合以下签名:

LONG WINAPI ExceptionFilter(_EXCEPTION_POINTERS* pExceptionInfo);
  • 参数 pExceptionInfo:指向 EXCEPTION_POINTERS 结构体的指针,包含异常上下文和记录信息。
  • 返回值:
    • EXCEPTION_EXECUTE_HANDLER:系统终止程序。
    • EXCEPTION_CONTINUE_SEARCH:系统继续查找其他异常处理程序(如默认错误对话框)。
    • EXCEPTION_CONTINUE_EXECUTION:尝试恢复执行(通常不推荐,可能导致不稳定)。

4.典型使用场景

4.1 记录崩溃信息

#include <Windows.h>
#include <DbgHelp.h> // 需要链接 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;
}

4.2禁止默认错误对话框

某些场景下(如后台服务程序),需禁止弹出系统错误对话框:

// 返回 EXCEPTION_EXECUTE_HANDLER 直接终止程序,不弹窗
SetUnhandledExceptionFilter(MyExceptionFilter);

5.注意事项

5.1 多线程安全

SetUnhandledExceptionFilter 是进程全局的,需确保在程序初始化时设置一次,避免多线程竞争。

5.2 第三方库的覆盖

某些库(如某些 C++ 运行时、防病毒软件)可能会覆盖你的异常过滤器。可在关键位置(如主循环)重复设置。

5.3 异常处理函数的可靠性

  • 避免在 ExceptionFilter 中分配内存或调用复杂函数(程序可能已处于不稳定状态)。
  • 直接使用 Win32 API(如 WriteFile)而非 C/C++ 标准库函数(如 fprintf)。

5.4 与 C++ 异常的区别

  • SEH 处理的是系统级异常(如访问违规),而 try/catch 仅捕获 C++ 异常(如 throw 语句抛出的异常)。
  • 若需同时处理 C++ 异常,需结合 std::set_terminate 或其他机制。

5.5 64 位系统的差异

  • 在 64 位 Windows 中,某些异常(如非法指令)可能无法被捕获,需检查文档或使用 Vectored Exception Handling(AddVectoredExceptionHandler)。

6.替代方案

  • Vectored Exception Handling (VEH)
    通过 AddVectoredExceptionHandler 注册异常处理函数,可捕获所有异常(包括已处理的异常)。
  • C++ 信号处理
    使用 signal 函数处理特定信号(如 SIGSEGV),但功能较为有限。

7.完整示例:生成 MiniDump

#include <Windows.h>
#include <DbgHelp.h>
#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;
}

8.总结

::SetUnhandledExceptionFilter(ExceptionFilter); 是 Windows 程序中捕获未处理异常的核心工具,常用于:

  • 生成崩溃转储文件(MiniDump)。
  • 记录错误日志。
  • 优雅终止程序。

使用时需注意异常处理函数的可靠性、线程安全性和潜在覆盖问题。对于复杂项目,建议结合 Vectored Exception Handling 或第三方崩溃报告库(如 Google Breakpad)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/73382.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

决策树算法详解:从西瓜分类到实战应用

目录 0. 引言 1. 决策树是什么&#xff1f; 1.1 生活中的决策树 1.2 专业版决策树 2. 如何构建决策树&#xff1f; 2.1 关键问题&#xff1a;选哪个特征先判断&#xff1f; 2.1.1 信息熵&#xff08;数据混乱度&#xff09; 2.1.2 信息增益&#xff08;划分后的整洁度提…

超融合服务器是什么

超融合服务器的定义与背景 超融合服务器&#xff08;Hyperconverged Infrastructure, HCI&#xff09;是一种通过软件定义技术&#xff0c;将计算、存储、网络和虚拟化功能整合到单一硬件平台中的IT基础设施解决方案。其核心目标是通过资源的高度集成和统一管理&#xff0c;简…

【网络层协议】NAT技术内网穿透

IP地址数量限制 我们知道&#xff0c;IP地址&#xff08;IPv4&#xff09;是一个4字节32位的整数&#xff0c;那么一共只有2^32也就是接近43亿个IP地址&#xff0c;而TCP/IP协议栈规定&#xff0c;每台主机只能有一个IP地址&#xff0c;这就意味着&#xff0c;一共只有不到43亿…

时隔多年,终于给它换了皮肤,并正式起了名字

时隔多年&#xff0c;终于更新了直播推流软件UI&#xff0c;并正式命名为FlashEncoder。软件仍使用MFC框架&#xff0c;重绘了所有用到的控件&#xff0c;可以有效保证软件性能&#xff0c;也便于后续进一步优化。 下载地址&#xff1a;https://download.csdn.net/download/Xi…

代码随想录第六十二天| Floyd 算法精讲 A * 算法精讲 (A star算法) 最短路算法总结篇

Floyd 算法精讲 题目描述 小明希望在公园散步时找到从一个景点到另一个景点的最短路径。给定公园的景点图&#xff0c;包含 N 个景点和 M 条双向道路&#xff0c;每条道路有已知的长度。小明有 Q 个观景计划&#xff0c;每个计划包含一个起点和终点&#xff0c;求每个计划的最…

如何避免测试环境不稳定导致的误报

避免测试环境不稳定导致误报的核心方法包括搭建独立稳定的测试环境、使用环境监控工具、建立环境变更管理机制、定期维护更新测试环境以及提升团队的环境管理意识。 其中&#xff0c;搭建独立稳定的测试环境尤为关键。独立的测试环境能有效隔离其他环境的干扰&#xff0c;保证测…

初级:I/O与NIO面试题深度剖析

一、引言 在Java开发中&#xff0c;I/O&#xff08;输入/输出&#xff09;操作是程序与外部设备&#xff08;如磁盘、网络等&#xff09;进行数据交互的重要方式。传统的I/O模型在处理大规模数据和高并发场景时存在一定的局限性&#xff0c;而NIO&#xff08;New I/O&#xff…

Axure RP9教程 :轮播图(动态面板) | 头部锁定

文章目录 引言I 轮播图操作步骤在画布中添加一个动态面板设置面板状态II 头部锁定将头部区域选中,右键组合或用Ctrl+G快捷键;将组合的头部区域,右键创建动态面板;引言 动态面板的功能十分强大,比如:拥有独立的内部坐标系,有多个状态; Banner的案例中会用到动态面板多个…

超微服务器主板重置ipmi登录密码

超微服务器主板重置ipmi登录密码 超微服务器的ipmi登录密码不对&#xff0c;需要重置但是bios内并没有找到可以设置的选项。 以下是解决办法&#xff1a; 安装IPMITOOL apt install ipmitool -y执行以下命令加载模块&#xff1a; modprobe ipmi_watchdog modprobe ipmi_po…

蓝桥杯第十届 数的分解

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 把 2019 分解成 3 个各不相同的正整数之和&#xff0c;并且要求每个正整数都不包含数字 2 和 4&#xff0c;一共有多少种不同的分解方法&#xff1f; 注意交换 3 个…

Docker入门篇4:查看容器资源、查看容器详细信息、查看容器日志、查看容器内运行的进程

大家好我是木木&#xff0c;在当今快速发展的云计算与云原生时代&#xff0c;容器化技术蓬勃兴起&#xff0c;Docker 作为实现容器化的主流工具之一&#xff0c;为开发者和运维人员带来了极大的便捷 。下面我们一起开始入门第四篇&#xff1a;查看容器资源、查看容器详细信息、…

基于数据挖掘的网络入侵检测关键技术研究

标题:基于数据挖掘的网络入侵检测关键技术研究 内容:1.摘要 随着互联网的迅速发展&#xff0c;网络安全问题日益严峻&#xff0c;网络入侵行为对个人、企业和国家的信息安全构成了巨大威胁。本文的目的是研究基于数据挖掘的网络入侵检测关键技术&#xff0c;以提高网络入侵检测…

中学数学几百年重大错误:将无穷多各异假R误为R——两数集相等的必要条件

中学数学几百年重大错误&#xff1a;将无穷多各异假R误为R——两数集相等的必要条件 黄小宁 设集A&#xff5b;x&#xff5d;表A各元均由x代表&#xff0c;相应变量x的变域是A。其余类推。本人多年前公开发表的论文中有定理&#xff1a; h定理&#xff08;两数集相等的必要条…

react-activation 实现页面保活记录

这里写目录标题 一、安装插件&#xff08;可选&#xff09;1、react-activation &#xff08;推荐&#xff09;2、umi-plugin-keep-alive 二、AliveScope的两种配置方式1、在src/app.ts 中配置2、在src/layout/index.tsx中配置 三、umi中的配置四、使用问题记录1、drop使用不生…

STM32使用红外避障传感器

1.1 介绍&#xff1a; 该传感器模块对环境光适应能力强&#xff0c;其具有一对红外线发射与接收管&#xff0c;发射管发射出一定频率的红外线&#xff0c;当检测方向遇到障碍物&#xff08;反射面&#xff09;时&#xff0c;红外线反射回来被接收管接收&#xff0c;经过比较器…

python tkinter 开发蓍草占卜系统

1. 项目概述 1.1 简介 蓍草占卜是中国传统的占卜方法&#xff0c;用于演算六十四卦。本系统通过现代编程技术&#xff0c;将传统的蓍草占卜方法数字化&#xff0c;提供一个准确、便捷的占卜工具。 蓍草占卜&#xff0c;作为中国古代的一种传统占卜方法&#xff0c;承载着深厚…

Linux搭建本地时间服务器及时间同步

搭建一个本地时间服务器&#xff0c;使得局域网内主机时间保持一致。 设置正确时间 # 设置系统时间 date -s "2025-03-25 17:31:00" # 将系统时间写入硬件时钟 hwclock --systohc时间服务器设置 系统应该预先安装chronyd 要允许 所有客户端 通过你的 chronyd 服务器…

2025-3-25算法打卡

一&#xff0c;走迷宫 1.题目描述&#xff1a; 给定一个 NMNM 的网格迷宫 GG。GG 的每个格子要么是道路&#xff0c;要么是障碍物&#xff08;道路用 11 表示&#xff0c;障碍物用 00 表示&#xff09;。 已知迷宫的入口位置为 (x1,y1)(x1​,y1​)&#xff0c;出口位置为 (x…

力扣刷题39. 组合总和

39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 需要定义一个index变量用来记录访问数组的下标&#xff0c;每次递归进行传参&#xff0c;在搜索过程中&#xff0c;因为为了避免重复数据&#xff0c;而且允许一个元素的重复出现&#xff0c;传入index时传入当前遍历的i…

ISIS-3 LSDB链路状态数据库同步

上一章我们介绍了ISIS的邻居建立关系以及ISIS的路由器角色有哪些,在不同的网络类型当中建立邻居关系有什么不同,并且以实验案例抓包的形式给大家进一步介绍了建立的过程。 这一章我们来介绍ISIS中是如何实现链路状态数据库同步的,与OSPF的链路状态同步有什么不同,在不同网络类…