net应用程序中发生了未经处理的异常怎么办_介绍一些在.NET Core 3.0中引入的诊断改进工具...
編者按:即使.NET Core3.1.5已經(jīng)發(fā)布,在進(jìn)行.NET Core的性能診斷時(shí),我們有時(shí)依然不知該從何處下手,那這篇介紹.NET Core3.0中引入的診斷工具,或許能為我們提供參考。
在.NET Core 3.0中,我們引入了一套工具,這些工具利用了.NET運(yùn)行時(shí)中的新功能,使診斷和解決性能問(wèn)題變得更加容易。
這些運(yùn)行時(shí)功能可幫助您回答一些常見(jiàn)的診斷問(wèn)題:
我的應(yīng)用程序健康嗎?
為什么我的應(yīng)用程序有異常行為?
為什么我的應(yīng)用程序崩潰了?
我的應(yīng)用程序健康嗎?
通常,應(yīng)用程序可能會(huì)慢慢開(kāi)始泄漏內(nèi)存,并最終導(dǎo)致內(nèi)存不足異常。在其他時(shí)候,某些有問(wèn)題的代碼路徑可能會(huì)導(dǎo)致CPU使用率激增。這些只是您可以通過(guò)指標(biāo)主動(dòng)識(shí)別的一些問(wèn)題類(lèi)別。
指標(biāo)
指標(biāo)表示一段時(shí)間內(nèi)的數(shù)據(jù)量度。指標(biāo)(或時(shí)間序列)數(shù)據(jù)使您可以從高層次觀察系統(tǒng)狀態(tài)。與Windows上的.NET Framework不同,.NET Core不會(huì)發(fā)出性能計(jì)數(shù)器。相反,我們引入了一種通過(guò)EventCounter?API?在.NET Core中發(fā)出指標(biāo)的新方法。
EventCounters提供了Windows性能計(jì)數(shù)器的改進(jìn),因?yàn)檫@些計(jì)數(shù)器現(xiàn)在可在支持.NET Core的所有操作系統(tǒng)上使用。此外,與perf計(jì)數(shù)器不同,它們還可以在低特權(quán)環(huán)境(例如xcopy部署)中使用。不幸的是,由于缺少諸如性能監(jiān)視器(perfmon)之類(lèi)的工具,因此很難實(shí)時(shí)使用這些指標(biāo)。
dotnet-counters
在3.0-preview5中,我們引入了一個(gè)新的命令行工具,用于實(shí)時(shí)觀察.NET Core應(yīng)用程序發(fā)出的指標(biāo)。
您可以通過(guò)運(yùn)行以下命令來(lái)安裝此.NET全局工具
dotnet?tool install?--global?dotnet-counters?--version?1.0.3-preview5.19251.2
在下面的示例中,當(dāng)我們將負(fù)載生成器指向Web應(yīng)用程序時(shí),我們看到應(yīng)用程序的CPU利用率和工作集內(nèi)存急劇上升。
有關(guān)如何使用此工具的詳細(xì)說(shuō)明,請(qǐng)參閱dotnet-counters自述文件。對(duì)于已知的限制,請(qǐng)查看GitHub上的未解決問(wèn)題。
dotnet-counters
為什么我的應(yīng)用程序有異常行為?
雖然指標(biāo)可以幫助識(shí)別異常行為的發(fā)生,但它們幾乎無(wú)法提供問(wèn)題的可見(jiàn)性。要回答為什么您的應(yīng)用程序具有異常行為的問(wèn)題,您需要通過(guò)跟蹤收集其他信息。例如,通過(guò)跟蹤收集的CPU配置文件可以幫助您識(shí)別代碼中的熱路徑。
追蹤
跟蹤是離散事件的不加時(shí)間戳的記錄。跟蹤包含本地上下文,可讓您更好地推斷系統(tǒng)的命運(yùn)。傳統(tǒng)上,.NET Framework(以及ASP.NET等框架)通過(guò)Windows事件跟蹤(ETW)發(fā)出有關(guān)其內(nèi)部的診斷跟蹤。在.NET Core中,這些跟蹤被寫(xiě)入Windows上的ETW和Linux上的LTTng。
dotnet-trace
在3.0-preview5中,每個(gè).NET Core應(yīng)用程序都會(huì)打開(kāi)一個(gè)雙工管道EventPipe(該管道可以在其上發(fā)出事件)(在* nix上是Unix域套接字/在Windows上是一個(gè)命名管道)。當(dāng)我們?nèi)栽谘芯靠刂破鲄f(xié)議時(shí),請(qǐng)實(shí)現(xiàn)此協(xié)議的預(yù)覽版。dotnet-trace
您可以通過(guò)運(yùn)行以下命令來(lái)安裝此.NET全局工具
dotnet?tool install?--global?dotnet-trace--version?1.0.3-preview5.19251.2
在上面的示例中,我dotnet trace使用默認(rèn)配置文件運(yùn)行,該配置文件啟用了CPU事件探查器事件和.NET運(yùn)行時(shí)事件。
除了默認(rèn)事件之外,您還可以根據(jù)要嘗試執(zhí)行的調(diào)查來(lái)啟用其他提供程序。
運(yùn)行后dotnet trace,將顯示一個(gè).netperf文件。該文件包含運(yùn)行時(shí)事件和可以在perfview中顯示的示例?CPU堆棧。Visual Studio的下一個(gè)更新(16.1)也將添加對(duì)可視化這些跟蹤的支持。
如果捕獲跟蹤時(shí)在OS X或Linux上運(yùn)行,則可以選擇將這些.netperf文件轉(zhuǎn)換為可以使用Speedscope.app可視化的.speedscope.json文件。您可以通過(guò)運(yùn)行以下命令來(lái)轉(zhuǎn)換現(xiàn)有跟蹤
dotnet?trace convert?<input-netperf-file>
下圖顯示了冰柱圖,可視化了我們剛剛在Speedscope中捕獲的軌跡。
有關(guān)如何使用此工具的詳細(xì)說(shuō)明,請(qǐng)參閱dotnet-trace自述文件。對(duì)于已知的限制,請(qǐng)查看GitHub上的未解決問(wèn)題。dotnet-trace為什么我的應(yīng)用程序崩潰了?
在某些情況下,僅通過(guò)跟蹤過(guò)程就不可能確定導(dǎo)致異常行為的原因。如果流程崩潰或我們可能需要更多信息(例如訪問(wèn)整個(gè)流程堆)的情況,則流程轉(zhuǎn)儲(chǔ)可能更適合分析。
轉(zhuǎn)儲(chǔ)分析
轉(zhuǎn)儲(chǔ)是通常在進(jìn)程意外終止時(shí)捕獲的進(jìn)程的工作虛擬內(nèi)存狀態(tài)的記錄。診斷核心轉(zhuǎn)儲(chǔ)通常用于確定應(yīng)用程序崩潰或意外行為的原因。
傳統(tǒng)上,您在應(yīng)用程序崩潰時(shí)依靠操作系統(tǒng)來(lái)捕獲轉(zhuǎn)儲(chǔ)(例如Windows錯(cuò)誤報(bào)告),或者在滿(mǎn)足某些觸發(fā)條件時(shí)使用procdump之類(lèi)的工具來(lái)捕獲轉(zhuǎn)儲(chǔ)。
迄今為止,在Linux上使用.NET捕獲轉(zhuǎn)儲(chǔ)的挑戰(zhàn)是使用NET捕獲轉(zhuǎn)儲(chǔ),gcore否則調(diào)試器會(huì)導(dǎo)致極大的轉(zhuǎn)儲(chǔ),因?yàn)楝F(xiàn)有工具不知道在.NET Core進(jìn)程中要修剪哪些虛擬內(nèi)存頁(yè)。
此外,即使您已經(jīng)收集了這些轉(zhuǎn)儲(chǔ),也仍然需要分析調(diào)試器,因?yàn)樗枰@取調(diào)試器并將其配置為加載sos(.NET的調(diào)試器擴(kuò)展),這具有挑戰(zhàn)性。
dotnet-dump
3.0.0-preview5,我們引入了一個(gè)新工具,使您可以捕獲和分析Windows和Linux上的進(jìn)程轉(zhuǎn)儲(chǔ)。
dotnet-dump?仍在積極開(kāi)發(fā)中,下表顯示了哪些操作系統(tǒng)當(dāng)前支持哪些功能。
| 視窗 | OS X | 的Linux | |
| 收集 | ? | ? | ? |
| 分析 | ? | ? | ? |
您可以通過(guò)運(yùn)行以下命令來(lái)安裝此.NET全局工具
dotnet?tool install?--global?dotnet-dump?--version?1.0.3-preview5.19251.2
安裝完成后,您可以通過(guò)運(yùn)行以下命令來(lái)捕獲進(jìn)程轉(zhuǎn)儲(chǔ)dotnet?dump
sudo?$HOME/.dotnet/tools/dotnet-dump?collect?-p?
在Linux上,可以通過(guò)運(yùn)行以下命令加載結(jié)果轉(zhuǎn)儲(chǔ)來(lái)分析結(jié)果轉(zhuǎn)儲(chǔ)
dotnet?dump?analyze?<dump-name>
在下面的示例中,我嘗試通過(guò)遍歷堆來(lái)確定崩潰轉(zhuǎn)儲(chǔ)的ASP.NET Core宿主環(huán)境。
有關(guān)如何使用此工具的詳細(xì)說(shuō)明,請(qǐng)參閱dotnet-dump自述文件。對(duì)于已知的dotnet-dump限制,請(qǐng)查看GitHub上的未解決問(wèn)題。
總結(jié)
以上是生活随笔為你收集整理的net应用程序中发生了未经处理的异常怎么办_介绍一些在.NET Core 3.0中引入的诊断改进工具...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: matlab 白色像素点,MATLAB
- 下一篇: 计算机网络 --- 传输层TCP协议