C++(Qt)軟件調試---學會使用ProcDump(5)未完待續

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”轉儲文件。
- 包括進程中線程的內核堆棧。
- 當使用克隆(-r)時,操作系統不支持內核轉儲(-mk)。
- 當使用多個轉儲大小時,每個轉儲大小都會有一個內核轉儲。

1.4 條件參數

    條件參數有什麼用

    procdump 的 Conditions 參數可以用來設置進程崩潰時觸發 Dump 文件生成的條件。

    通過設置 Conditions 參數,我們可以根據進程的狀態、性能指標等信息來觸發 Dump 文件的生成,進而更好地定位程序崩潰的原因。

    Conditions 參數可以設置的條件包括:

        CPU 佔用率:當進程的 CPU 佔用率超過指定的閾值時,生成 Dump 文件。
        內存佔用率:當進程的內存佔用率超過指定的閾值時,生成 Dump 文件。
        I/O 操作:當進程的 I/O 操作數超過指定的閾值時,生成 Dump 文件。
        異常:當進程發生指定類型的異常時,生成 Dump 文件。

    通過設置 Conditions 參數,我們可以針對具體的場景精確觸發 Dump 文件的生成,從而更好地定位程序崩潰的原因。

    例如,當進程的 CPU 佔用率突然飆升時,可以使用 Conditions 參數來自動觸發 Dump 文件的生成,以便分析佔用 CPU 的代碼片段。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章