詳細說明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.pswp.cn/web/73382.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73382.shtml
英文地址,請注明出處:http://en.pswp.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的鏈路狀態同步有什么不同,在不同網絡類…