前言
今天,向大家介紹幾種可以抓取應用程式轉儲檔案的工具及基本使用方法。更詳細的用法,請參考每個工具對應的幫助文檔。如果你還不清楚什麼是轉儲檔案,不知道什麼時候需要轉儲檔案,請參考轉儲檔案系列文章的第一篇 —— 轉儲檔案知多少。
約定
下文中提到的異常,都是指未處理的異常。為了行文友善(其實是我懶,想少打幾個字),用異常代替。
各種抓取轉儲檔案的工具
有很多工具都可以抓取轉儲檔案。我列舉幾個常用的工具并簡單介紹使用方法。
-
任務管理器
任務管理器是唾手可得的抓取轉儲檔案的工具。按住
即可打開。打開任務管理器後,在需要轉儲的程序上Ctrl + Shift + Esc
->右鍵
,即可自動儲存轉儲檔案到建立轉儲檔案(C)
目錄下。%tmp%
使用 taskmanager 抓取 dump 截圖dump分析工具_你需要知道的 N 種抓取 dump 的工具
提示:
建立成功後,會彈出對話框提示轉儲檔案儲存的位置。一般儲存在系統臨時目錄下。在檔案管理器位址欄輸入
即可快速打開臨時目錄,對
%temp%
等其它目錄同樣有效。
%appdata%
how-to-open-temp-folder
- process explorer
比系統自帶的任務管理器更強大,之前寫過一篇文章介紹使用 process explorer 替換任務管理器的文章。感興趣的小夥伴兒可以看一看。打開process explorer
,在需要轉儲的程序上,process explorer
->右鍵
->Create Dump
就可以儲存轉儲檔案了。(Create Full Dump...
抓取的資訊少,但抓取的轉儲檔案小,适合網絡傳輸,請根據自己的需要選擇)Create Minidump...
使用 process explorer 抓取 dump 截圖dump分析工具_你需要知道的 N 種抓取 dump 的工具
3. visual studio
visual studio
簡稱
vs
,大家應該對
vs
應該非常熟悉了,我就不多介紹了。打開
vs
,附加到需要轉儲的程序上,點選
Break All
按鈕(或者按快捷鍵
Ctrl + Alt + Break
)暫停目标程序。然後點選
Debug
->
Save Dump As...
就可以儲存轉儲檔案了。如果不暫停目标程序,
Save Dump As...
按鈕是置灰的。
使用 vs 抓取 dump 錄屏
提示:
可以使用
快速打開
Ctrl + Alt + P
界面,選擇要附加的程序。
Attach to Process
4. windbg
windbg
是
windows
系統上非常強大的調試器,基本上我隻用
windbg
分析轉儲檔案。能分析轉儲檔案,當然能儲存轉儲檔案了。打開
windbg
,附加到需要轉儲的程序上,執行
.dump [Options] path/to/save/dump.dmp
使用 windbg 抓取 dump 錄屏
可以使用
.hh .dump
檢視
.dump
指令的幫助文檔。其中的
/m[MiniOptions]
會直接影響生成的轉儲檔案的内容和尺寸。我們有必要了解每個選項的意義。因為我實在是太懶了,就貼一張
MSDN
上的截圖吧。
注意:
最好用
位的
32
附加
windbg
位程序,
32
位的
64
附加
windbg
位程序。如果用
64
位的
64
附加到
windbg
位程序後,直接執行
32
指令生成的轉儲檔案會 “有問題”。
.dump
-
procdump
終于,要介紹我最喜歡的
了。procdump
是我用過的最好用的抓取轉儲檔案的工具了。強烈建議你也試試。這裡隻簡單介紹一些基本用法,因為用法實在是太多了,要完整介紹的話恐怕單獨寫一篇文章都介紹不完,而且很多進階用法我也不熟悉,都是用到了再去查幫助文檔。如果你想了解更多進階用法,請參考官方文檔[1] 或《Windows Sysinternals 實戰指南》中介紹procdump
的章節。procdump
- 直接運作
檢視用法。procdump
procdump 幫助dump分析工具_你需要知道的 N 種抓取 dump 的工具 - 運作
檢視使用範例。procdump -? -e
procdump 用例dump分析工具_你需要知道的 N 種抓取 dump 的工具 - 為指定程序
的程序生成轉儲檔案。ID
procdump [-mp] process_id [path/to/save/dump]
- 為指定程序名的程序生成轉儲檔案(注意:如果系統中存在多個名為
的程序,會報錯)process_name
procdump [-mp] process_name [path/to/save/dump]
-
-x
選項,啟動一個新程序并監視。
啟動的程序退出就儲存轉儲檔案。procdump -x path/to/save/dump process_to_start process_parameters
- 啟動的程序有未處理的異常的時候才儲存轉儲檔案。
procdump -e -x path/to/save/dump process_to_start process_parameters
注意:選項必須在最後。
-x
後面必須跟着轉儲檔案的儲存路徑。
-x
-
選項,等待程序啟動。-w
是w
的縮寫。需要與其它指令配合使用。wait
-
選項,監控程序的挂起狀态。-h
是h
的縮寫。hang
-
選項,監控程序的異常狀态。-e
是e
的縮寫。exception
-
選項,在程序終止時建立轉儲檔案。-t
是t
terminate
的縮寫。
一般情況下,我們隻關心程序異常退出的情況,但有時候我們也關心程序正常退出的情況。這時候我們可以使用此選項,在程序退出的時候生成轉儲檔案。不論程序是被強制終止的,還是由于異常退出的,還是正常退出的,統統沒問題。
- 監視程序的運作狀态并在程序發生異常的時候生成
。可以與dump
選項一起使用。-w
procdump [option] -e [-w] process_name or process_id [path/to/save/dump]
- 監視程序的運作狀态并在程序挂起的時候生成
。可以與dump
選項一起使用。-w
procdump [option] -h [-w] process_name or process_id [path/to/save/dump]
- 監視程序的運作狀态,不論是否發生異常,隻要程序退出就建立轉儲檔案。
注意:
因為
是用來等待尚未啟動的程序的,是以不能與
-w
一起使用。沒啟動的程序當然沒有程序
process_id
了。如果在一起使用,會報如下錯誤:
ID
The wait option requires the process be specified by name.
- 每隔
秒儲存一次轉儲檔案,一共儲存5
次。3
procdump -s 5 -n 3 process_name or process_id [path/to/save/dump]
- 當程序
高于CPU 占用率
,并持續%10
的時候生成轉儲檔案,最多生成2s
個。10
procdump -s 2 -n 10 -c 10 process_name or process_id [path/to/save/dump]
-
dump
檔案名生成規則
如果我們沒指定轉儲檔案的名字,
會根據procdump
的規則生成。相信,細心的小夥伴已經從錄屏裡看出來了。這樣我們就不用擔心之前生成的轉儲檔案被覆寫了。PROCESSNAME_YYMMDD_HHMMSS
-
-mp
選項
使用該選項可以大大的降低轉儲檔案的大小。強烈建議啟用此選項。具體工作原理,請參考《Windows Sysinternals 實戰指南》。
-mp選項介紹 截自英文版dump分析工具_你需要知道的 N 種抓取 dump 的工具 - 安裝
為事後調試器(procdump
),或者叫postmortem debugger
調試器 (JIT
Just In Time Debugger
)。
以管理者權限運作
可以注冊procdump -i
為事後調試器。注冊的時候可以指定轉儲檔案儲存的路徑,及轉儲選項。例如,procdump
procdump -mp -i e:\dumps\
。
以管理者權限運作
可以解除注冊。procdump -u
提示:
以管理者權限運作
可以設定
windbg -I
為事後調試器。注意:是大寫的
windbg
,不是小寫的
I
。後面會專門寫一篇文章介紹
i
相關的内容。
Just In Time Debug
- Much Much More ...
你知道嗎?官方文檔中的
procdump
一節中有
Learn More
上的視訊連結,非常值得一看。
Defrag Tools
的作者是
procdump
和
Mark Russinovich
。
Andrew Richards
是
Andrew Richards
的主持人之一。
Defrag Tools
這裡是一份使用
procdump
的錄屏,展示了上面介紹的幾種用法,感興趣的小夥伴可以點開看看。
procdump 用例示範
-
其它工具
講道理,隻要是調試器就應該提供儲存轉儲檔案的功能。比如,
,cdb
等。令我感到意外的是ntsd
和x64dbg
居然沒有儲存轉儲檔案的功能?不過,這不影響這兩個調試器的偉大!如果你自己寫調試器的話,請一定要加上儲存轉儲檔案的功能。除了上文中提到的各種工具和調試器外,還有很多其它工具也可以儲存轉儲檔案。比如,ollydbg
,DebugDia
,AdPlus
等。如果對哪個工具感興趣,請自行研究。gflags
總結
- 有很多優秀的工具可以幫我們抓取轉儲檔案,我認為最好用的非
莫屬。procdump
-
非常有用,可以讓我們在程序異常退出時收到通知,并做相應的處理。JIT Debug
參考資料
- 《軟體調試》
- 《Windows Sysinternals 實戰指南》
- Microsoft Document : .dump (Create Dump File)[2]
- procdump[3]
References:
[1] 官方文檔: https://docs.microsoft.com/en-us/sysinternals/downloads/procdump
[2] Microsoft Document : .dump (Create Dump File): https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/-dump--create-dump-file-
[3] procdump: https://docs.microsoft.com/en-us/sysinternals/downloads/procdump
猜你喜歡:
轉儲檔案知多少
[原]調試實戰——程式CPU占用率飙升,你知道如何快速定位嗎?
[原]調試實戰——使用windbg調試崩潰在ole32!CStdMarshal::DisconnectSrvIPIDs
[原]調試實戰——崩潰在ComFriendlyWaitMtaThreadProc
[原]調試實戰——調試PInvoke導緻的記憶體破壞
[原]調試實戰——調試excel啟動時死鎖
[原]調試實戰——調試TerminateThread導緻的死鎖
[原]調試實戰——調試DLL解除安裝時的死鎖
[原]排錯實戰——拯救加載調試符号失敗的IDA
[原]排錯實戰——使用process explorer替換任務管理器
[原]排錯實戰——VS清空最近打開的工程記錄
[原]排錯實戰——解決Tekla通過.tsep安裝插件失敗的問題
[原]排錯實戰——你知道拖動視窗時隻顯示虛框怎麼設定嗎?
[原]排錯實戰——通過對比分析sysinternals事件修複程式功能異常
你知道怎麼使用DebugView檢視調試資訊嗎?
歡迎留言交流