1、前言
1.1 ProcDump是什麼
ProcDump是一個由Microsoft Sysinternals開發的命令行小工具,用於在Windows系統上監視和生成進程轉儲文件。
它可以監視進程在CPU使用率、內存佔用、I/O操作等方面的性能,並在進程崩潰時自動生成轉儲文件,以便進行後續調試和分析。
ProcDump的主要功能包括:
支持監視進程的CPU使用率、內存佔用、I/O操作等性能指標;
支持生成進程轉儲文件以進行後續調試和分析;
支持設置條件觸發進程轉儲,如CPU使用率超過某個閾值;
支持生成完整的進程轉儲文件或者只生成異常堆棧信息;
支持遠程監視和生成進程轉儲文件。(windows服務器)
ProcDump是一款功能強大的小工具,對於Windows系統下的進程監視和調試非常有幫助。
在Github上也有一個ProcDump工具,可用於Linux系統(linux上功能沒有Windows的強)。。
1.2 爲什麼要用ProcDump
之前用過的方法DbgHelp、qBreakpad生成Dump、Linux下配置ulimit -c unlimited生成core的方式功能都比較單一,並且需要配置環境,在程序中調用庫,使用較爲複雜。
而ProcDump 使用非常簡單,不需要配置環境,不需要修改代碼,將程序下載到本地後,通過命令行設置監聽條件、需要監聽的程序,然後就可以在條件滿足或者目標程序崩潰時快速生成進程轉儲文件。
在Windows中還可以爲MinGW編譯的程序生成dump文件,這是之前的幾種方法不支持的。
並且procdump和之前的幾種捕獲dump/core的方式並不衝突,可以一起使用。
2、下載安裝ProcDump
1.1 Windows
下載地址及官方資料
測試環境:
系統:Windows10
Qt版本:Qt5.12.5
編譯器:MinGW64、MSVC2017-64
如圖所示,點擊直接下載,非常小的工具,還不到1M;
解壓後如下圖所示;
-
因爲會經常用到,所以最好把Procdump文件夾添加進環境變量中;
-
搜索環境變量,打開【編輯系統編輯變量】程序;
點擊【環境變量】按鍵;
雙擊【Path】->【新建】->加入Procdump所在路徑,然後全部點確定;
打開一個cmd窗口,輸入procdump,如果打印出help信息則安裝成功;
注意:這裏有一個有意思的現象,解壓文件夾下原來有3個文件,但是當運行procdump後就會發現procdump64不見了;
但是當我們再運行procdump 捕獲64位程序時就會發現,運行期間procdump64會突然出現,運行結束後就又消失了;
而運行procdump捕獲32位程序時procdump64不會出現;
所以不用擔心,這只是procdump處理32/64位程序的策略。
3、Windows下使用ProcDump
1.1 使用方法分類
ProcDump從使用方式上可以分爲兩種:
第一種是每次使用命令行指定要監控、捕獲的目標程序,只對這一個程序生效;
第二種是將ProcDump安裝到AeDebug中,只需要執行一次安裝命令,後續不用重複設置,可對所有程序生效,只要有程序異常退出就可以在指定目錄下生成Dump文件。
1.2 使用語法
捕獲目標程序語法:
procdump.exe [-mm] [-ma] [-mt] [-mp] [-mc <Mask>] [-md <Callback_DLL>] [-mk]
[-n <Count>]
[-s <Seconds>]
[-c|-cl <CPU_Usage> [-u]]
[-m|-ml <Commit_Usage>]
[-p|-pl <Counter> <Threshold>]
[-h]
[-e [1] [-g] [-b] [-ld] [-ud] [-ct] [-et]]
[-l]
[-t]
[-f <Include_Filter>, ...]
[-fx <Exclude_Filter>, ...]
[-dc <Comment>]
[-o]
[-r [1..5] [-a]]
[-at <Timeout>]
[-wer]
[-64]
{
{{[-w] <Process_Name> | <Service_Name> | <PID>} [<Dump_File> | <Dump_Folder>]}
|
{-x <Dump_Folder> <Image_File> [Argument, ...]}
}
安裝使用方式語法:
procdump.exe -i [Dump_Folder]
[-mm] [-ma] [-mt] [-mp] [-mc <Mask>] [-md <Callback_DLL>] [-mk]
[-r]
[-at <Timeout>]
[-k]
[-wer]
卸載語法:
procdump.exe -u
1.3 Dump類型參數
Procdump 工具提供了多種不同的 dump types(轉儲類型)選項,用於控制生成的進程轉儲文件的內容和大小。
生成的dump越大,保存的信息越詳細,但生成速度就越慢。
需要根據不同的調試和分析需求選擇合適的 dump types,以便生成最有用的進程轉儲文件。
在實際使用中,可以根據進程的大小、穩定性和性能要求等因素來選擇不同的 dump types,以達到最佳的調試和分析效果。
Dump類型 | 說明 |
---|---|
-mm | 寫入“Mini”轉儲文件。 (默認值) - 包括直接或間接引用的內存 (堆棧及其) 引用的內容。 - 包括 (進程、線程、模塊、句柄、地址空間等) 的所有元數據。 - 由於 MiniDump 文件比較小,因此生成速度比較快,但是不夠詳細, 可能無法滿足高級調試和分析需求。 |
-ma | 寫入“Full”轉儲文件。 - 包括所有內存 (映像、映射和專用) 。 - 包括 (進程、線程、模塊、句柄、地址空間等) 的所有元數據。 - 是一種最詳細的轉儲類型,包含了進程的所有信息,包括代碼、數據、堆、棧等等。 FullDump 文件非常大,生成速度比較慢,但是可以提供最全面的信息, 適合用於高級調試和分析。 |
-mt | 寫入“Triage”轉儲文件。 - 包括直接引用的內存 (堆棧) 。 - 包括有限的元數據 (進程、線程、模塊和句柄) 。 - 嘗試刪除敏感信息,但不能保證。 - 是一種特殊的轉儲類型,用於生成進程的三態(triage)轉儲文件。 三態轉儲文件包含了進程的核心信息和一些關鍵的線程和內存信息, 可以用於快速分析進程崩潰和異常問題。由於三態轉儲文件比 MiniDump 文件稍大, 因此生成速度比 MiniDump 慢,但是比 FullDump 快,適合用於快速診斷問題 |
-mp | 寫入“MiniPlus”轉儲文件。 - 包括所有專用內存和所有讀/寫映像或映射內存。 - 包括 (進程、線程、模塊、句柄、地址空間等) 的所有元數據。 - 爲了最小化大小,將排除超過 512MB 的最大專用內存區域。 內存區域定義爲相同大小的內存分配的總和。 轉儲與完整轉儲一樣詳細,但大小爲 10%-75%。 - 注意:由於調試限制,CLR 進程將轉儲爲 Full (-ma) 。 - 是一種介於 MiniDump 和 FullDump 之間的轉儲類型,包含 MiniDump 中的基本信息 以及更多的線程和內存信息。MiniPlusDump 文件比 MiniDump 文件稍大, 但是生成速度比 FullDump 快,適合一些中等大小的進程。 |
-mc | 寫入“Custom”轉儲文件。 - 包括由指定的 MINIDUMP_TYPE 掩碼 (十六進制) 定義的內存和元數據。 |
-md | 寫入“Callback”轉儲文件。 - 包括由指定DLL的名爲MiniDumpCallbackRoutine的MiniDumpWriteDump 回調例程定義的內存。 - 包括 (進程、線程、模塊、句柄、地址空間等) 的所有元數據。 |
-mk | 此外,還要編寫“Kernel”轉儲文件。 |
1.4 條件參數
條件參數有什麼用
procdump 的 Conditions 參數可以用來設置進程崩潰時觸發 Dump 文件生成的條件。
通過設置 Conditions 參數,我們可以根據進程的狀態、性能指標等信息來觸發 Dump 文件的生成,進而更好地定位程序崩潰的原因。
Conditions 參數可以設置的條件包括:
CPU 佔用率:當進程的 CPU 佔用率超過指定的閾值時,生成 Dump 文件。
內存佔用率:當進程的內存佔用率超過指定的閾值時,生成 Dump 文件。
I/O 操作:當進程的 I/O 操作數超過指定的閾值時,生成 Dump 文件。
異常:當進程發生指定類型的異常時,生成 Dump 文件。
通過設置 Conditions 參數,我們可以針對具體的場景精確觸發 Dump 文件的生成,從而更好地定位程序崩潰的原因。
例如,當進程的 CPU 佔用率突然飆升時,可以使用 Conditions 參數來自動觸發 Dump 文件的生成,以便分析佔用 CPU 的代碼片段。