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