一、Windows系統的任務管理器里抓dump
啟動任務管理器,選中某個進程,右鍵,彈出菜單"創建轉儲文件"
注意事項:
當你在64位Windows系統上抓32位進程的dmup文件時,如果用的是64位任務管理器,那么在用Windbg加載后,要用!wow64exts.sw切換到X86模式下,如果不想做這步切換,就要用32位的任務管理器來生成dmp文件。32位任務管理器在C:\Windows\SysWOW64\Taskmgr.exe
適合的場景:在任務管理器里還能看到進程,當程序出現業務問題、性能問題、失去響應;當程序崩潰跳出系統錯誤提示框的時候,特別適合應用在客戶機出現上述問題時使用。因為我們不用傳其他工具到客戶機上。
二、用Windbg來抓取
2.1、方法一:啟動windbg ,附加到我們關心的進程,執行命令 .dump [/ma/mdi] [存放路徑]
適合的場景:在任務管理器里還能看到進程,當程序出現業務問題、性能問題、失去響應;當程序崩潰跳出系統錯誤提示框的時候,適合在公司內部測試時開發人員和測試人員使用
2.2、方法二 監視特定進程,當某進程崩潰時自動抓取dump
先運行可能存在問題的程序,然后執行命令在命令行里 執行 ..\WinDbg\adplus.vbs(exe) -crash -pn qq.exe -o c:\1.dmp。運行此命令后,WinDbg會跳出黑色窗口,用於監控進程的運行狀況,注意不要關閉這個窗口,否則Dump就抓不到了。在目標進程里執行業務操作,當崩潰后,Dump文件會保存在指定的輸出路徑里。
在指定的輸出目錄下生成如下目錄
參數說明:
- -crash: 當程序掛掉的一剎那抓取Dump,這個參數只能抓到程序報錯時的信息,如果程序不報錯,則無法抓到Dump。
- -hang: 當開啟WinDbg之后就開始抓取Dump,主要用於抓取程序異常,但程序未崩潰的情況,例如進程的CPU使用率100%。
- -pn:進程的PID或進程名,如果是進程名,會區分大小寫。
- -o: Dump輸出路徑.
適合的場景:程序已經運行,但不知道什么時候會崩潰且不會有錯誤提示框的情況。
2.3、方法三 將Windbg設置為默認調試工具
首先,執行 在命令行Windbg.exe -I 設置為默認調試工具,會彈出Windbg窗口
點“確定”窗口消失,然后運行程序和操作,當程序崩潰時WibDbg窗口再次彈出來,在windbg 命令行執行命令.dump [/ma/mdi] [存放路徑]
參數說明:
-I: 將WinDbg作為默認的調試工具,注意I必須為大寫,小寫無效。
適合的場景:不知道什么時候會崩潰。無需指定要抓取的進程或PID,也不要求設置環境時必須存在進程,只要任意程序崩潰后都可以抓到Dump。
三、修改注冊表
@echo off
echo 正在啟用Dump...
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps"
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpFolder /t REG_EXPAND_SZ /d "C:\CrashDump" /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpType /t REG_DWORD /d 2 /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpCount /t REG_DWORD /d 10 /f
echo Dump已經啟用
pause
@echo on
將上述內存保存為*.bat,然后執行,就開始了自動抓dmp文件的功能,只要有程序崩潰,就會在指定的目錄下生成。
鍵值說明:
名稱:DumpCount
,類型:REG_DWORD
,最大保留Dump個數,默認為10.
名稱:DumpType
,類型:REG_DWORD
,Dump類型(1-Mini dump, 2-Full dump),默認為1.
名稱:DumpFolder
,類型:REG_EXPAND_SZ
,Dump文件保存的位置。
當不需要自動抓取時,可以將下面的內容
@echo off
echo 正在關閉Dump...
reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /f
echo Dump已經關閉
pause
@echo on
保存為bat執行,就不會在自動產生了
適合的場景:也是不知道什么時候程序會崩潰,也無法確定崩潰是否會重現,只要有崩潰就會被抓取,萬無一失。
四、編程
直接使用Windows的API——MiniDumpWriteDump和SetHandleExceptionFilter。在我們自己的應用里使用這兩個API來實現程序崩潰時自動產生dump文件,並且還可以實現自己的dump上傳機制等,不過要注意如果某些庫會導致我們程序的機制失效。
五、Process Explorer
這個也是要注意在64位機上抓32位進程的問題,跟任務管理一樣處理
寫在最后:當然還有更多的工具和方法,包括上面介紹的工具和方法,我們可以根據實際情況和需要靈活應用,抓取dmp文件來幫助我們調試定位問題