首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 監控系統進程異常/彈窗錯誤:掛鉤調試 API 實現「華醫生」機制

     編輯:程式設計綜合問答

需在自身程式中監控指定進程是否發生崩潰或彈出錯誤對話框(如「xxx 已停止工作」)。

核心原理

Windows 錯誤報告機制(WER,俗稱「華醫生」)屬使用者模式元件,順序為:

  1. 調試器進程(若進程被調試)。
  2. 進程自訂的異常處理器(SetUnhandledExceptionFilter)。
  3. 系統預設錯誤報告介面(華醫生)。

要最先攔截異常,**將自身作為調試器附加到目標進程** 是最高優先級。

實作路徑

  1. 使用 CreateProcess + DEBUG_PROCESS / DEBUG_ONLY_THIS_PROCESS 啟動目標進程,或 DebugActiveProcess(pid) 動態附加。
  2. 迴圈呼叫 WaitForDebugEvent(&dbgEvent, INFINITE) 等待異常事件。
  3. 檢查 dbgEvent.dwDebugEventCode == EXCEPTION_DEBUG_EVENT,取得 EXCEPTION_DEBUG_INFO 內的例外碼、地址、參數。
  4. 記錄/上報後,呼叫 ContinueDebugEvent(pid, tid, DBG_EXCEPTION_NOT_HANDLED) 讓系統繼續處理(彈窗/終止)。
  5. 若需攔截「彈窗」類錯誤(非例外,如 `MessageBox`),需掛鉤 `User32.dll!MessageBox*` 或使用 UI Automation 監控視窗建立事件。

參考資源

注意:調試器附加需足夠權限(管理員/同用戶),且會影響目標進程效能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved