上週和你們分享了.NET 5開源工做流框架elsa,程序跑起來後,想看一下後臺線程的執行狀況。抓了個進程Dump後,使用WinDbg調試,加載SOS調試器擴展,結果沒法正常使用了:html
0:000> .loadby sos clr
Unable to find module 'clr'git
這引發了我的的興趣,必需要從新掌握.NET 5 / .NET Core 下WinDbg調試技能。那麼,咱們就開始吧:github
1、先安裝WinDbg架構
推薦的下載連接(老版本的WinDbg):https://raw.githubusercontent.com/EasyDarwin/Tools/master/Windbg_x86_x64/dbg_amd64.msi框架
若是各位想嚐鮮,也能夠從Windows Store下載 WingDbg Preview版本async
下載後,一步一步安裝便可。post
啓動後的界面:學習
2、安裝最新版本的dotnet-sos測試
使用SOS調試器擴展,可使用本地調試器(WinDbg、lldb)調試.NET Core 程序。ui
推薦你們詳細學習參考這篇文檔:dotnet-sos install
關於SOS調試器擴展,推薦你們看這篇連接:SOS調試器擴展
咱們使用dotnet global tool 下載安裝最新的dotnet-sos Nuget包
dotnet tool install --global dotnet-sos
安裝成功後,咱們須要繼續安裝dotnet-sos
dotnet-sos install [--architecture <arch>]
架構有如下選項:
安裝完成後,有這麼一條提示:
Execute '.load C:\Users\zhougq\.dotnet\sos\sos.dll' to load SOS in your Windows debugger.
總結如下:WinDbg or cdb by running .load %USERPROFILE%\.dotnet\sos\sos.dll in the debugger.
原先咱們使用.load by sos,在.NET Core 或者 .NET 5中須要直接按指定目錄加載SOS調試器擴展了。
3、新建.NET 5應用,運行起來抓Dump
調試環境ready後,咱們啓動.NET 5 WinDbg調試了
首先咱們找個.NET 5 Console應用(你們能夠本身新建一個),這裏我使用了上次研究elsa的測試工程了:
測試代碼:
1 using Microsoft.Extensions.DependencyInjection; 2 using Microsoft.Extensions.Hosting; 3 using Microsoft.Extensions.Logging; 4 using System; 5 using System.Threading.Tasks; 6 using Elsa.Activities.Console.Activities; 7 using Elsa.Activities.Console.Extensions; 8 using Elsa.Activities.Timers.Extensions; 9 using Elsa.Expressions; 10 using Elsa.Extensions; 11 using Elsa.Services; 12 using NodaTime; 13 14 namespace ElsaRecurringTaskWorkflow 15 { 16 using Elsa.Activities.Console.Extensions; 17 18 class Program 19 { 20 static async Task Main(string[] args) 21 { 22 var host = new HostBuilder() 23 .ConfigureServices(ConfigureServices) 24 .ConfigureLogging(logging => logging.AddConsole()) 25 .UseConsoleLifetime() 26 .Build(); 27 28 using (host) 29 { 30 await host.StartAsync(); 31 await host.WaitForShutdownAsync(); 32 } 33 } 34 35 private static void ConfigureServices(IServiceCollection services) 36 { 37 services 38 .AddElsaCore() 39 .AddConsoleActivities() 40 .AddTimerActivities(options => options.Configure(x => x.SweepInterval = Duration.FromSeconds(1))) 41 .AddWorkflow<RecurringTaskWorkflow>(); 42 } 43 } 44 }
Run 跑起來:
在Windows 任務管理器中抓個Dump
4、使用WinDbg調試.NET 5 應用
在上一步中,咱們抓了一個Dump文件:C:\Users\zhougq\AppData\Local\Temp\ElsaRecurringTaskWorkflow.DMP
咱們打開Windbg
而後打開咱們剛纔抓的Dump文件:Open Dump File
首次打開會比較慢,WinDbg會嘗試下載所須要的pdb調試符號,稍等一會便可。
下載複製完成後,咱們就能夠開始調試了:
首先,加載SOS擴展:
.load C:\Users\zhougq\.dotnet\sos\sos.dll
接下來,你們能夠根據須要去不一樣的調試指令了,例如!runaway !threadpool !syncblk等:
詳細的WinDbg調試交差你們能夠參考:
https://www.cnblogs.com/tianqing/p/11307049.html
以上是使用WinDbg調試.NET 5的技術分享,下一篇將給你們繼續分享Linux抓Dump分享的技能。
推薦幾個不錯的連接:
周國慶
2021/1/17