读懂DUMP文件
目錄
一、什么是Dump文件
二、Dump文件的類型
2.1 內核模式Dump
2.2 用戶模式Dump
三、Dump文件的生成
3.1?通過調試工具生成
3.2 通過使用任務管理器生成
3.3 通過編程自動生成
四、各種抓取DUMP的工具
一、什么是Dump文件
對于程序崩潰,最快的解決方式是生成dump文件,通過生成dump文件使用調試工具進行調試,還原程序崩潰時的狀態,能夠起到快速定位排查問題的作用。dump文件是進程的內存鏡像??梢园殉绦虻膱绦袪顟B通過調試器保存到dump文件中。Dump文件是用來給驅動程序編寫人員調試驅動程序用的,這種文件必須用專用工具軟件打開。
二、Dump文件的類型
2.1 內核模式Dump
Dump文件分為兩大類,內核模式Dump和用戶模式Dump。內核模式Dump是操作系統創建的崩潰轉儲,最經典的就是系統藍屏,這時候會自動創建內核模式的Dump。
2.2 用戶模式Dump
用戶模式Dump進一步可以分為完整Full Dump和Mini dump。Full Dump包含了某個進程完整的地址空間數據,以及許多用于調試的信息,而Mini dump則有許多類型,根據需要可以包含不同的信息,有的可能只包含某個線程和部分模塊的信息。
三、Dump文件的生成
Dump文件能夠保存程序內部的內存、堆棧、句柄、線程等程序運行相關的信息,非常具有重要性。
3.1?通過調試工具生成
通過調試工具創建。調試工具如Visual Studio,Windbg以及微軟提供的ADplus都可以創建DUMP,在Windbg中通過.dump命令來生成。
3.2 通過使用任務管理器生成
該方式可以生成.DMP文件,通過打開任務管理器,找到插件服務對應的進程,右擊,選擇創建轉儲文件:
.DMP文件的存放位置如下圖所示:
3.3 通過編程自動生成
當程序遇到未處理異常(主要指非指針造成)導致程序崩潰死,如果在異常發生之前調用了SetUnhandledExceptionFilter()函數,異常交給函數處理。因而,在程序開始處增加SetUnhandledExceptionFilter()函數,并在函數中利用適當的方法生成Dump文件,即可實現需要的功能。
在編程過程中,可以預期的異常都通過結構化異常(try/catch)進行了處理。此時,如果發生了未預期的異常,這些異常處理代碼無法處理,則轉由Windows提供的默認異常處理器來進行處理,這個特殊的異常處理函數為UnhandledExceptionFilter。該函數會顯示一個消息框,提示發生了未處理的異常,同時,讓用戶選擇結束或調試該進程。也就是如下界面:
因此,為了更友好的處理未預期的異常(主要是創建內存轉儲),可以覆蓋默認的異常處理操作。這是通過函數SetUnhandledExceptionFilter完成的,函數原型如下:
lpTopLevelExceptionFilter即異常處理函數指針,如果設置為NULL,則默認使用UnhandledExceptionFilter。因此我們可以對照lpTopLevelExceptionFilter自定義一個異常處理函數。我們需要創建內存轉儲。這通過函數MiniDumpWriteDump來實現。
下述代碼是一個通過MiniDumpWriteDump函數來實現轉儲文件創建
四、各種抓取DUMP的工具
任務管理器
任務管理器是自帶抓取轉儲文件的工具。按住?Ctrl + Shift + Esc?即可打開。打開任務管理器后,在需要轉儲的進程上右鍵?->?創建轉儲文件(C),即可自動保存轉儲文件到?%tmp%?目錄下。
process explorer
process explorer?比系統自帶的任務管理器更強大,打開?process explorer,在需要轉儲的進程上,右鍵?->?Create Dump?->?Create Full Dump...?就可以保存轉儲文件了。(?Create Minidump...?抓取的信息少,但抓取的轉儲文件小,適合網絡傳輸,根據自己的需要選擇)
?Visual Studio
visual studio?簡稱?vs,大家應該對?vs?應該非常熟悉了,我就不多介紹了。打開?vs,附加到需要轉儲的進程上,點擊?Break All?按鈕(或者按快捷鍵?Ctrl + Alt + Break)暫停目標進程。然后點擊?Debug?->?Save Dump As...?就可以保存轉儲文件了。如果不暫停目標進程,Save Dump As...?按鈕是置灰的
windbg
windbg?是?windows系統上非常強大的調試器,windbg能分析轉儲文件,當然能保存轉儲文件了。打開?windbg,附加到需要轉儲的進程上,執行?.dump [Options] path/to/save/dump.dmp
總結
- 上一篇: Exp 8 Web基础 20164318
- 下一篇: 在ubuntu20.04下搭建lamp环