.NET 5 程式高階除錯-WinDbg

Eric zhou發表於2021-01-17

上週和大家分享了.NET 5開源工作流框架elsa,程式跑起來後,想看一下後臺執行緒的執行情況。抓了個程式Dump後,使用WinDbg除錯,載入SOS偵錯程式擴充套件,結果無法正常使用了:

0:000> .loadby sos clr
Unable to find module 'clr'

這引起了個人的興趣,必須要重新掌握.NET 5 / .NET Core 下WinDbg除錯技能。那麼,我們就開始吧:

一、先安裝WinDbg

推薦的下載連結(老版本的WinDbg):https://raw.githubusercontent.com/EasyDarwin/Tools/master/Windbg_x86_x64/dbg_amd64.msi

如果各位想嚐鮮,也可以從Windows Store下載 WingDbg Preview版本

 下載後,一步一步安裝即可。

 

 啟動後的介面:

 

二、安裝最新版本的dotnet-sos

  使用SOS偵錯程式擴充套件,可以使用本地偵錯程式(WinDbg、lldb)除錯.NET Core 程式。

  推薦大家詳細學習參考這篇文件: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偵錯程式擴充套件了。

三、新建.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

 

四、使用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

相關文章