異常轉儲

異常轉儲(abnormal dump)是指當程式發生異常特別是不可重現的異常時通過對特定進程、執行緒在記憶體中運行狀態的快照等事後調試協助手段快速定位問題的方法。

基本介紹

  • 中文名:異常轉儲
  • 外文名:abnormal dump
  • 套用領域:計算機等
  • 涉及領域:計算機
  • 涉及軟體:VB.NET等
  • 特徵:不可重現
簡介,技術領域,背景技術,實現方案,技術方案,特殊之處,包含模組,權利要求,VB.NET在WinCE5.0中異常轉儲,捕獲異常,語法,未處理異常過濾器或事件,JIT調試,獲取異常結構體指針,生成轉儲檔案,

簡介

異常轉儲特殊之處在於該系統以計算機模型的計算引擎為驅動,包括異常檢測模組,用於檢測計算模型的運行情況,如果發生異常調用異常轉儲模組存儲上下文信息;異常轉儲模組,用於保存計算模型上下文信息;異常轉儲檔案讀取模組,讀取異常轉儲檔案,恢復發生異常時上下文信息。本發明的系統可以在計算模型運行發生異常(計算模型啟動後長時間不結束)時,記錄所有上下文信息,並在恢復時構造異常發生時的上下文信息,用於驗證是否修改有效,且可以模擬出異常發生時的情況,利於分析原因,修改計算模型。

技術領域

涉及計算機模型,特別涉及一種計算機模型異常轉儲與恢復系統及其轉儲與恢複方法。

背景技術

對於計算模型在現場運行過程中,由於計算模型的編寫錯誤或測點值讀取失敗等原因可能導致計算模型發生異常。當現場出現異常後,只能靠以往經驗來判斷問題的起因,修改計算模型。
這樣帶來了幾個弊端:
  • 一、由於沒有出現異常時的上下文信息,無法驗證是否修改有效;
  • 二、有可能修改錯誤,反而增加計算模型運行中的風險;
  • 三、修改效率低下,定位不準確。
  • 四、需要具有豐富經驗的人員參與修改。
上述問題急需解決。

實現方案

為了彌補現有技術的不足,計算模型在運行過程中發生異常時,可以通過異常轉儲機制記錄異常發生時的上下文信息,當修改計算模型後,恢復異常時的上下文的信息,以用於驗證是否修改有效。

技術方案

通過如下技術方案實現:
一種計算機模型異常轉儲與恢復系統,其特殊之處在於:該系統以計算機模型的計算引擎為驅動,包括:
  • 異常檢測模組,用於檢測計算模型的運行情況,如果發生異常調用異常轉儲模組存儲上下文信息;
  • 異常轉儲模組,用於保存計算模型上下文信息;
  • 異常轉儲檔案讀取模組,讀取異常轉儲檔案,恢復發生異常時上下文信息。

特殊之處

異常轉儲與恢復系統轉儲與恢復的方法,其特殊之處在於:
  1. 載入計算模型檔案,啟動計算引擎運行計算模型,同時記錄計算模型運行起始時間,開啟異常檢測模組啟動定時器,定時器每隔一定周期利用當前時間減去計算模型運行起始時間得到運行時長,運行時長與用戶配置的最大時長進行比較,如果超出,通過異常轉儲模組,調用計算引擎來保存上下文信息,並通知計算引擎終止計算任務;
  2. 當發生異常後,通過計算引擎接口獲取運行時的上下文信息,將上下文信息組織成XML格式,再將上下文信息保存到檔案中;
  3. 異常轉儲檔案讀取模組讀取步驟(2)保存的上下文信息,然後將該上下文信息通過計算引擎接口設定到計算引擎中,即引擎讀取的數據為異常時的數據,啟動計算引擎。
  4. 有益效果是:本發明的系統可以在計算模型運行發生異常(計算模型啟動後長時間不結束)時,記錄所有上下文信息,並在恢復時構造異常發生時的上下文信息,用於驗證是否修改有效,且可以模擬出異常發生時的情況,利於分析原因,修改計算模型。

包含模組

系統是以計算機模型的計算引擎為驅動,包括:
  • 異常檢測模組,用於檢測計算模型的運行情況,如果發生異常調用異常轉儲模組存儲上下文信息;
  • 異常轉儲模組,用於保存計算模型上下文信息;
  • 異常轉儲檔案讀取模組,讀取異常轉儲檔案,恢復發生異常時上下文信息。
本發明的二次設備智慧型狀態評估診斷系統,啟動計算引擎的同時載入異常檢測模組,異常檢測模組與定時器連線,通過輸入設備調用異常轉儲檔案讀取模組在顯示器上顯示異常時上下文信息,異常轉儲模組與儲存器連線。

權利要求

  • 一種計算機模型異常轉儲與恢復系統,其特徵在於:該系統以計算機模型的計算引擎為驅動,包括: 異常檢測模組,用於檢測計算模型的運行情況,如果發生異常調用異常轉儲模組存儲上下文信息; 異常轉儲模組,用於保存計算模型上下文信息; 異常轉儲檔案讀取模組,讀取異常轉儲檔案,恢復發生異常時上下文信息。
  • 根據權利要求1所述的二次設備智慧型狀態評估診斷系統,其特徵在於:啟動計算引擎的同時載入異常檢測模組,異常檢測模組與定時器連線,通過輸入設備調用異常轉儲檔案讀取模組在顯示器上顯示異常時上下文信息,異常轉儲模組與儲存器連線。
  • 根據權利要求1或2所述的計算機模型異常轉儲與恢復系統轉儲與恢復的方法,其特徵在於:包括以下步驟:
    (1)載入計算模型檔案,啟動計算引擎運行計算模型,同時記錄計算模型運行起始時間,開啟異常檢測模組啟動定時器,定時器每隔一定周期利用當前時間減去計算模型運行起始時間得到運行時長,運行時長與用戶配置的最大時長進行比較,如果超出,通過異常轉儲模組,調用計算引擎來保存上下文信息,並通知計算引擎終止計算任務;
    (2)當發生異常後,通過計算引擎接口獲取運行時的上下文信息,將上下文信息組織成XML格式,再將上下文信息保存到檔案中;
    (3)異常轉儲檔案讀取模組讀取步驟(2)保存的上下文信息,然後將該上下文信息通過計算引擎接口設定到計算引擎中,即引擎讀取的數據為異常時的數據,啟動計算引擎。

VB.NET在WinCE5.0中異常轉儲

windows系統中,當應用程式出現嚴重錯誤無法運行時,系統會啟動JIT調試器,JIT調試器可以做兩類事情:
  • 1)直接附加到出錯進程上通過調試來分析、定位問題。
  • 2)收集、記錄錯誤發生時的現場數據提供事後分析。
在WinCE上,希望利用第二種方式:也就是使用WER(Windwos Error Reporting)功能生成轉儲檔案(dump檔案)來進行事後分析。

捕獲異常

轉儲檔案是對特定進程、執行緒在記憶體中運行狀態的快照,只有在異常發生時產生的快照才對我們查找問題有意義,因此首先需要捕獲異常,捕獲異常為我們生成轉儲檔案提供了時機以及必要的上下文環境,例如只有在異常被捕獲的狀態下,Native的GetExceptionInformation和CLR的GetExceptionPointers才能獲取到PEXCEPTION_POINTERS指針。我把捕獲異常的方式分成3種:

語法

程式語言都提供了異常捕獲的語法關鍵字,例如對於C++和VB .NET:
C++ SEH
vb .net
__try __except
try catch
在try 塊中發生異常以後,程式跳轉到異常處理塊中,在異常處理塊中我們可以進行異常轉儲。
使用VB.NET的try catch得到異常轉儲的時機

未處理異常過濾器或事件

Windows Native
Windows CLR
Application..::.ThreadException
_AppDomain..::.UnhandledException
l SetUnhandledExceptionFilter
為一個套用的所有進程和執行緒設定一個頂級異常處理函式
l Application..::.ThreadException
UI執行緒產生的異常處理事件
l _AppDomain..::.UnhandledException
非UI執行緒產生的異常處理事件
WinCE不提供SetUnhandledExceptionFilter
cf .net 不提供Application..::.ThreadException和_AppDomain..::.UnhandledException

JIT調試

如果所有其它異常捕獲機制都沒有生效,系統根據註冊表的設定嘗試使用JIT調試器來分析問題。windows默認的jit調試器是Dr.Watson,它將為出錯程式生成一個轉儲檔案。
WinCE從5.0開始加入WER模組(windowserror reporting),也是為出錯的程式生成轉儲檔案。
這種方式下系統自動生成dump。
EVC程式可以生成dump,VB.net程式無法生成dump。

獲取異常結構體指針

因為以上兩種都不可行,因此採用語法的方式繼續嘗試。在捕獲異常以後,要想保存轉儲檔案,需要先獲取異常結構指針。系統提供了以下函式
Windows Native
Windows CLR
GetExceptionInformation
GetExceptionPointers
WinCE提供了GetExceptionInformation,但GetExceptionInformation並不是函式,而是一個宏,並且只允許在異常處理過濾表達式中調用,這意味著VB.Net代碼無法通過P/Invoke調用GetExceptionInformation。
cf .net不提供GetExceptionPointers
結論是VB.NET無法獲取異常結構體指針

生成轉儲檔案

在Windows中獲取到正確的異常結構指針以後,就可以調用MiniDumpWriteDump保存轉儲檔案,但是在CE5.0並沒有MiniDumpWriteDump,它使用了CaptureDumpFileOnDevice和ReportFault。
Windows Native
WinCE 5.0
MiniDumpWriteDump
CaptureDumpFileOnDevice
ReportFault
VB.NET適用性:
1. 雖然wince提供了ReportFault,但是因為3.2的結論,導致VB.NET無法調用ReportFault(異常結構指針參數無法獲取)。
2.CaptureDumpFileOnDevice通過試驗可以產生dump,但是這個函式的參數是進程號和執行緒號,也就是說它無法保存異常發生時的狀態。嘗試了在VB.NET程式中P/InvokeCaptureDumpFileOnDevice,分析產生的dump檔案發現堆疊信息缺少了託管代碼的部分:

相關詞條

熱門詞條

聯絡我們