.NET 5 程序高級調試-WinDbg

上週和你們分享了.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>]

    架構有如下選項:

  • Arm
  • Arm64
  • X86
  • X64

   

   安裝完成後,有這麼一條提示:

   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程序調試系列-索引篇

 

以上是使用WinDbg調試.NET 5的技術分享,下一篇將給你們繼續分享Linux抓Dump分享的技能。

推薦幾個不錯的連接:

        dotnet-sos install

        SOS調試器擴展

 

周國慶

2021/1/17

相關文章
相關標籤/搜索