日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

读懂DUMP文件

發布時間:2023/12/8 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 读懂DUMP文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

一、什么是Dump文件

二、Dump文件的類型

2.1 內核模式Dump

2.2 用戶模式Dump

三、Dump文件的生成

3.1?通過調試工具生成

3.2 通過使用任務管理器生成

3.3 通過編程自動生成

四、各種抓取DUMP的工具


一、什么是Dump文件

對于程序崩潰,最快的解決方式是生成dump文件,通過生成dump文件使用調試工具進行調試,還原程序崩潰時的狀態,能夠起到快速定位排查問題的作用。dump文件是進程的內存鏡像。可以把程序的執行狀態通過調試器保存到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完成的,函數原型如下:

LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(_In_ LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter

lpTopLevelExceptionFilter即異常處理函數指針,如果設置為NULL,則默認使用UnhandledExceptionFilter。因此我們可以對照lpTopLevelExceptionFilter自定義一個異常處理函數。我們需要創建內存轉儲。這通過函數MiniDumpWriteDump來實現。
下述代碼是一個通過MiniDumpWriteDump函數來實現轉儲文件創建

LONG WINAPI MyUnhandledExceptionFilter( struct _EXCEPTION_POINTERS *ExceptionInfo ) {HANDLE hFile = CreateFile("mini.dmp", GENERIC_READ|GENERIC_WRITE,FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if( hFile == INVALID_HANDLE_VALUE )return EXCEPTION_EXECUTE_HANDLER;MINIDUMP_EXCEPTION_INFORMATION mdei;mdei.ThreadId = GetCurrentThreadId();mdei.ExceptionPointers = ExceptionInfo;mdei.ClientPointers = NULL;MINIDUMP_CALLBACK_INFORMATION mci; mci.CallbackRoutine = NULL; mci.CallbackParam = 0; MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &mdei, NULL, &mci); CloseHandle(hFile);AfxMessageBox("已成功創建崩潰轉儲!");return EXCEPTION_EXECUTE_HANDLER; }

四、各種抓取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

總結

以上是生活随笔為你收集整理的读懂DUMP文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。