自定義VS程序異常處理及調試Dump文件(一)


1. Dump文件

1. Dump文件介紹

Dump文件(Dump File),也叫轉儲文件,以.DMP為文件后綴。dump文件是進程在內存中的鏡像文件,通過轉換然后存儲成以.DMP后綴的文件。dump文件根據存儲時的選項不同,會生成不同大小的文件,其中記錄信息也自然有所不同。

2. Dump文件分類

程序分兩種,內核模式程序和用戶模式程序,也即Ring0程序和Ring3程序。Dump文件是伴隨着程序而生成的,所以Dump文件也同樣分兩種。 
1. Kernel-Mode Dump Files(內核模式Dump文件),主要是驅動程序,此文不涉及。 
2. User-Mode Dump Files(用戶模式Dump文件),主要是應用程序及服務程序,此文所講。 
用戶模式Dump文件又分Full User-Mode Dumps和Minidumps。前者生成的是完整的內存快照,所以文件比較大。后者依然生成選項,生成包含不同信息的Dump文件。此文以Minidumps文件來分析調試。

3. Dump文件生成方式

  1. 通過WinDbg工具的命令 
    用WinDbg來Attach崩潰提示窗口的process,然后輸入.dump /m C:\myapp.dmp命令,即可生成默認的miniDump文件(只包含系統信息、加載的模塊(DLL)信息、 進程信息和線程信息)。
  2. 通過Windows任務管理器,選擇指定進程,右鍵生成轉儲文件(此時的轉儲文件即為Full User-Mode Dumps,包含所有信息,所以文件比較大)。
  3. 通過代碼在程序崩潰時生成Dump文件。
#include <DbgHelp.h> #pragma comment(lib, "Dbghelp.lib") // 此函數需要包含上面頭文件和引入相應的庫 LONG WINAPI ExceptionFilter(EXCEPTION_POINTERS* _pExcp) { HANDLE hFile = CreateFile( "d:\\Format.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hFile) { return EXCEPTION_CONTINUE_EXECUTION; } MINIDUMP_EXCEPTION_INFORMATION einfo = {0}; einfo.ThreadId = ::GetCurrentThreadId(); einfo.ExceptionPointers = _pExcp; einfo.ClientPointers = FALSE; MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, // 指定生成默認的Minidump文件 &einfo, NULL, NULL); CloseHandle(hFile); return EXCEPTION_EXECUTE_HANDLER; } // 下面函數放在當前模塊的入口函數處,指定ExceptionFilter替換原生的異常處理 // 即當原本要彈出崩潰提示窗口前,需要經過此函數處理,可以處理完立即退出,也可以繼續 SetUnhandledExceptionFilter(ExceptionFilter); 

Dump文件

1. 使用Visual Studio

  • 選擇與生成Dump文件相同版本的VS。
  • 啟動VS並打開Dump文件。
  • 必須保證生成Dump文件的程序的PDB文件和源代碼相一致。
  • VS2005打開Dump文件時,直接按F5調試,代碼會停在出錯的地方,通過Call Stack窗口查看。
  • VS2010打開Dump文件時, 
    Dump 
    需要通過Set symbol paths設置符號文件路徑,也即PDB文件路徑。然后點擊Debug with Native Only,代碼即會暫時在出錯的地方,通過Call Stack窗口查看相關信息。

2. 使用WinDbg

  • 選擇相應版本的WinDbg,x86還是AMD64(也即X64,因為64桌面架構系統是AMD最新發布)。
  • File->Open Crush Dump,打開指定的Dump文件。
  • File->Symbol File Path,添加srv*D:\Symbols*http://msdl.microsoft.com/download/symbols
  • File->Symbol File Path,添加程序的PDB文件夾路徑。這樣可以調試系統DLL,也可以調試自有程序。
  • 然后在WinDbg命令行中輸入!analyze -v,等待WinDbg分析完畢。
  • WinDbg
  • 通過上圖,即可以看到代碼崩潰的行數。

3. 自定義崩潰窗口

    1. 通常Windows會提供一個默認的崩潰提示窗口,或者是程序直接閃退。 
      此處輸入圖片的描述
    2. 重寫ExceptionFilter函數,即可以重新定義崩潰窗口,用以提示用戶發送相關信息給軟件提供商。 
      此處輸入圖片的描述
    3. 示例代碼 
      示例代碼是Win32類型的DLL,導出接口SetCustomUnhandledExceptionFilter在Solution的啟動Project的最開始調用一次即可。 
      下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM