MiniDump (Error Dump System)

MiniDump (Error Dump System)是ProudNet提供的一項功能,當遊戲用戶端或遊戲伺服器在網路遊戲服務過程中崩潰時,開發者可以立即收集錯誤訊息,以便追蹤原因並及時採取行動。

錯誤信息作爲*.DMP文件進行收集,開發者可以從開發工具(如VisualStudio等)中打開收集到的轉儲文件,檢查源文件在哪個行發生了衝突。

構建錯誤轉儲系統教程

錯誤轉儲系統構建教程包括遊戲服務器和客戶端。

(1) 安裝 DbgHelp 庫

dbghelp.dll 複製到安裝 OS 的文件夾 (C:\Windows\system32) 或應用程序當前文件夾中 。 dbghelp.dll(ProudNet 安裝路徑)\ProudNet\Sample\Bin 中 。

(2) 配置 Visual Studio 編譯選項

爲實現MiniDump (Error Dump System),請如下進行C++編譯設置。

配置用於使用錯誤轉儲系統的編譯

(3) 轉儲服務器製作示例

負責收集轉儲客戶端發送的錯誤信息轉儲文件。

(4) 轉儲客戶端程序

轉儲客戶端負責將包含錯誤信息的轉儲文件傳輸到轉儲服務器。

進程中有衝突時, 自動臨時 *.創建DMP轉儲文件後重新執行該過程,命令參數(Command Argument)將附加錯誤等級信息

這樣作爲命令因子進入的錯誤等級信息要根據嚴重程度進行分支處理,MiniDumpAction_AlarmCrash屬於嚴重錯誤,因此必須填寫將轉儲文件傳送給轉儲服務器的代碼。

(5) 爲遊戲服務器創建轉儲客戶端

遊戲服務器一般不提供用戶UI,因此不顯示錯誤報告對話框需要編寫代碼以便將*.DMP轉儲文件直接發送到轉儲服務器。

(6) 爲遊戲客戶端創建轉儲客戶端

遊戲客戶端一般提供用戶UI,因此顯示錯誤報告生成的需要編寫代碼向遊戲用戶確認*.DMP轉儲文件是發送到轉儲服務器還是省略後進行。

利用錯誤轉儲系統

- 在轉儲系統中攔截 C 運行錯誤

錯誤轉儲系統基本上沒有檢測到STL中的out-of-the-range錯誤或pure virtual function在運行時間調用錯誤。

錯誤轉儲系統僅處理Structured Exception,因爲上述錯誤是在C runtime library中消化的。 因此,這些錯誤必須在C runtime library消化之前繞過StructuredException才能留下錯誤轉儲。

下面是留下錯誤轉儲的方法。

- 無中斷的錯誤轉儲系統(Exception Logger)

ProudNet提供在程序發生錯誤時不關閉程序,繼續保留錯誤位置的功能。 這被稱爲無中斷的錯誤轉儲系統(Exception Logger)

一般遊戲服務器在發生衝突時,會立即留下情況並重新啓動程序,但不得已時,在不重新啓動程序的情況下,維持出現錯誤的情況,有時需要強行維持遊戲服務器的運行。

但是,如果內存狀態已經崩潰的服務器程序繼續運行,會很危險,所以要注意。

無中斷錯誤轉儲系統製作前檢查事項

  • 必須安裝DbgHelp庫(dbghelp.dll)。

  • 您需要爲 Visual Studio 設置 C++ Exception 編譯選項。

  • Include : DumpCommon.h, MiniDumper.h

  • Link : ProudNetCommon.lib

製作示例

在程序的起點(Main Entry Point)上, 呼叫 CExceptionLogger::Instance().Init() 函數來初始化 CExceptionLogger 實例。 繼承 IExceptionLoggerDelegate 抽象類別並重寫 GetDumpDirectory() 成員來定義轉儲檔案路徑。 如果返回空格 (""),則轉儲檔案將保存在目前資料夾中。

此示例源文件位於 <安裝文件夾>\Sample\SimpleExceptionLogger 中。

- 將進程的當前狀態保留爲轉儲文件

即使沒有出現錯誤,此功能也可以將進程的當前狀態保留爲轉儲文件,如果保存的轉儲文件與創建該轉儲程序時一起生成的調試信息文件(.pdb)一起打開,則可以在源級別上查看進程運行中的情況。

通過此功能,即使在調試困難的環境下,您也可以將進程的當前狀態保留爲自卸。

此功能即使在調試困難的環境下也能使過程保持自卸狀態。 調用 Proud.CMiniDumper.WriteDumpFromHere 將調用時點的進程中的所有線程的調用棧保存爲轉儲文件。

Last updated