最近幾天接到了幾個crash的求助,可能這幾個朋友沒玩過怎麼去生成dump,只能手把手教,感受也不是一個辦法,因此有必要總結一下,後續再有朋友諮詢的話,我就能夠把這篇文章丟過去了😏😏😏,好了,我大概總結了下面三種方式:git
老讀者應該知道,我一直都推崇 procdump 去搞定這些事情,畢竟它是一款可跨平臺抓取的強大靈巧工具。github
從 dump 樣原本看,web類的程序是最多的,因此這裏我就以 Asp.NET MVC 5
做爲案例,在 RouteConfig 類中我使用一個Timer不斷的拋出異常,目的就是把 w3wp 進程給弄掛掉,參考代碼以下:web
public class RouteConfig { public static Timer timer; public static void RegisterRoutes(RouteCollection routes) { timer = new Timer(new TimerCallback(m => { var r = 10 / Convert.ToInt32("0"); }), null, 60000, 5000); routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } }
對了,確定有朋友問:爲何不在 Action 中拋異常,這是由於 Http管道
會把這種異常包裝成 http 500,因此就達不到 crash 的效果了。windows
接下來把程序部署到 IIS 上並運行,能夠清楚的看到 Windows 事件查看器
中成功的記錄到了崩潰信息,以下圖所示:xcode
這種方式簡單但不太穩定,由於有幾個朋友告訴我,procdump在抓取的過程當中報錯了,緣由是進程已退出,無論怎麼說這個要看你運氣了哈,這裏的 -e
是 exception
的簡寫,具體可參見官方文檔: https://docs.microsoft.com/zh...編輯器
-e Write a dump when the process encounters an unhandled exception. Include the 1 to create dump on first chance exceptions.
完整的參考命令以下:工具
C:\Windows\system32>procdump -e -ma -w w3wp E:\test ProcDump v10.0 - Sysinternals process dump utility Copyright (C) 2009-2020 Mark Russinovich and Andrew Richards Sysinternals - www.sysinternals.com Waiting for process named w3wp... ... Press Ctrl-C to end monitoring without terminating the process. [21:12:08] Exception: 04242420 [21:12:08] Exception: E0434352.CLR [21:12:09] Exception: E0434352.CLR [21:12:09] Exception: E0434352.CLR [21:12:09] Exception: E0434352.CLR [21:12:09] Exception: E0434352.CLR [21:12:09] Exception: E0434352.CLR [21:12:14] Exception: C0000094.INT_DIVIDE_BY_ZERO [21:12:14] Unhandled: C0000094.INT_DIVIDE_BY_ZERO [21:12:14] Dump 1 initiated: E:\test\w3wp.exe_210525_211214.dmp [21:12:14] Dump 1 writing: Estimated dump file size is 326 MB. [21:12:15] Dump 1 complete: 326 MB written in 1.2 seconds [21:12:15] Dump count reached.
從輸出信息看已經成功抓取了 dump 文件,若是你的機器有多個 w3wp,能夠將其替換成 pid,參考命令以下:post
C:\Windows\system32>procdump -e -ma 9320 E:\test
它的大概運做原理是:當程序出現了未處理異常,此時會激活操做系統的 Win32 unhandled exception filter
,這個過濾器會調用註冊表中 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
節點配置的調試器,也就是個人 Procdump,要將 procdump 送到註冊表的 AeDebug 節點,可使用 -i
進行註冊。測試
-i Install ProcDump as the AeDebug postmortem debugger. Only -ma, -mp, -d and -r are supported as additional options.
完整參考命令以下:url
C:\Windows\system32>procdump -ma -i E:\test ProcDump v10.0 - Sysinternals process dump utility Copyright (C) 2009-2020 Mark Russinovich and Andrew Richards Sysinternals - www.sysinternals.com Set to: HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug (REG_SZ) Auto = 1 (REG_SZ) Debugger = "C:\xcode\soft\Procdump\procdump.exe" -accepteula -ma -j "E:\test" %ld %ld %p Set to: HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug (REG_SZ) Auto = 1 (REG_SZ) Debugger = "C:\xcode\soft\Procdump\procdump.exe" -accepteula -ma -j "E:\test" %ld %ld %p ProcDump is now set as the Just-in-time (AeDebug) debugger.
從輸出信息看已經成功將其送入到註冊表了,接下來能夠打開 註冊表編輯器
去驗證。
最後就是把 web 跑起來,1min以後就會成功的看到 E:\test
下的 dump 文件啦,截圖以下:
從圖中看有2個dump,具體爲何是2個我就無論了,就怕不生成。😏😏😏
它的大概運做原理是藉助 windows 自帶的 Windows Error Reporting
服務去幫助咱們生成程序的 crash dump,要實現的話,必須開啓這個服務而且在註冊表中配置好你要抓取的exe程序,配置起來有點繁瑣,這裏有一個bat腳本,直接運行便可,簡單粗暴。
SET DMPPATH=E:\test SC CONFIG WerSvc START= AUTO NET START WerSvc ECHO 啓用完成 REG DELETE HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger /f REG DELETE HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\DbgManagedDebugger /f REG DELETE HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger /f REG DELETE HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\DbgManagedDebugger /f ECHO 刪除完成 REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\w3wp.exe" /f REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\w3wp.exe" /t REG_SZ /v DumpFolder /d %DMPPATH% /f REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\w3wp.exe" /t REG_DWORD /v DumpCount /d 2 /f REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\w3wp.exe" /t REG_DWORD /v DumpType /d 2 /f ECHO 啓用完成 PAUSE
有3個參數須要簡單解釋一下。
bat執行完成後,能夠到註冊表中驗證一下。
接下來把web跑起來,1min以後你就會看到生成的dump文件了,截圖以下:
對於抓取程序crash的dump,這三種方式基本上就能夠作到萬無一失,總結完後,對你對我都是節省寶貴的時間😘😘😘。
更多高質量乾貨:參見個人 GitHub: dotnetfly