日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET程序崩溃了怎么抓 Dump ? 我总结了三种方案

發布時間:2023/12/4 asp.net 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET程序崩溃了怎么抓 Dump ? 我总结了三种方案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一:背景

1. 講故事

最近幾天接到了幾個crash的求助,可能這幾個朋友沒玩過怎么去生成dump,只能手把手教,感覺也不是一個辦法,所以有必要總結一下,后續再有朋友咨詢的話,我就可以把這篇文章丟過去了????????????,好了,我大概總結了下面三種方式:

  • procdump -e

  • procdump -> AEDebug

  • Windows Error Reporting

老讀者應該知道,我一直都推崇 procdump 去搞定這些事情,畢竟它是一款可跨平臺抓取的強大靈巧工具。

二: 實現可測試案例

從 dump 樣本來看,web類的程序是最多的,所以這里我就以 Asp.NET MVC 5 作為案例,在 RouteConfig 類中我使用一個Timer不斷的拋出異常,目的就是把 w3wp 進程給弄掛掉,參考代碼如下:

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 的效果了。

接下來把程序部署到 IIS 上并運行,可以清楚的看到 Windows 事件查看器 中成功的記錄到了崩潰信息,如下圖所示:

三: 3種抓取方式解析

1. 使用 procdump -e

這種方式簡單但不太穩定,因為有幾個朋友告訴我,procdump在抓取的過程中報錯了,原因是進程已退出,不管怎么說這個要看你運氣了哈,這里的 -e 是 exception 的簡寫,具體可參見官方文檔: https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump。

-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:\testProcDump?v10.0?-?Sysinternals?process?dump?utility Copyright?(C)?2009-2020?Mark?Russinovich?and?Andrew?Richards Sysinternals?-?www.sysinternals.comWaiting?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,參考命令如下:

C:\Windows\system32>procdump?-e?-ma?9320?E:\test

2. 將 procdump 作為 AeDebug 的默認調試器

它的大概運作原理是:當程序出現了未處理異常,此時會激活操作系統的 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.

完整參考命令如下:

C:\Windows\system32>procdump?-ma?-i?E:\testProcDump?v10.0?-?Sysinternals?process?dump?utility Copyright?(C)?2009-2020?Mark?Russinovich?and?Andrew?Richards Sysinternals?-?www.sysinternals.comSet?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?%pSet?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?%pProcDump?is?now?set?as?the?Just-in-time?(AeDebug)?debugger.

從輸出信息看已經成功將其送入到注冊表了,接下來可以打開 注冊表編輯器 去驗證。

最后就是把 web 跑起來,1min之后就會成功的看到 E:\test 下的 dump 文件啦,截圖如下:

從圖中看有2個dump,具體為什么是2個我就不管了,就怕不生成。????????????

3. 借助 Windows Error Reporting 生成

它的大概運作原理是借助 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 /fREG DELETE HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger /f REG DELETE HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\DbgManagedDebugger /fECHO 刪除完成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 /fECHO 啟用完成PAUSE

有3個參數需要簡單解釋一下。

  • DumpFolder:dump的存放路徑

  • DumpCount:?最多保留幾個 dump 文件

  • DumpType:? 0:Custom dump. ?1:Mini dump. ?2:Full dump

bat執行完成后,可以到注冊表中驗證一下。

接下來把web跑起來,1min之后你就會看到生成的dump文件了,截圖如下:

三:總結

對于抓取程序crash的dump,這三種方式基本上就可以做到萬無一失,總結完后,對你對我都是節省寶貴的時間????????????。

END

工作中的你,是否已遇到 ...?

1. CPU爆高

2. 內存暴漲

3. 資源泄漏

4. 崩潰死鎖

5. 程序呆滯

等緊急事件,全公司都指望著你能解決...? 危難時刻才能展現你的技術價值,作為專注于.NET高級調試的技術博主,歡迎微信搜索: 一線碼農聊技術,免費協助你分析Dump文件,希望我能將你的踩坑經驗分享給更多的人。

總結

以上是生活随笔為你收集整理的.NET程序崩溃了怎么抓 Dump ? 我总结了三种方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。