程序地带

.NET 5 程序高级调试-WinDbg


上周和大家分享了.NET 5开源工作流框架elsa,程序跑起来后,想看一下后台线程的执行情况。抓了个进程Dump后,使用WinDbg调试,加载SOS调试器扩展,结果无法正常使用了:


0:000> .loadby sos clrUnable 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:Userszhougq.dotnetsossos.dll" to load SOS in your Windows debugger.


   总结以下:WinDbg or cdb by running .load %USERPROFILE%.dotnetsossos.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:UserszhougqAppDataLocalTempElsaRecurringTaskWorkflow.DMP


   我们打开Windbg


   


   然后打开我们刚才抓的Dump文件:Open Dump File


   


首次打开会比较慢,WinDbg会尝试下载所需要的pdb调试符号,稍等一会即可。


 


下载复制完成后,我们就可以开始调试了:


首先,加载SOS扩展:


.load C:Userszhougq.dotnetsossos.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


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/tianqing/p/14289170.html

随机推荐

SAP-CAP云平台开发#1

SAP-CAP云平台开发#1

AboutCAPCAP的全称是SAPCloudApplicationProgrammingModel,它是一个包含了语言,功能库和编译企业级服务,应用工具的框...

深海牧民 阅读(830)

vue 父组件props传值子组件时 的更新问题

问题描述:父组件通过props的形式传值到子组件,子组件获取的数值可以更新,但视图不更新解决方法:方法1.在子组件中监听此prop属性ÿ...

东方孤独 阅读(323)

2020-12-08

for循环实例1、计算100以内(含)所有奇数和偶数的和(1)、首先需要定义两个存放最终的结果的变量。(2)、奇数和...

布朗熊ლ 阅读(658)

SpringCloud之Open Feign服务调用快速入门分析案例

文章目录OpenFeign是什么OpenFeign实现服务调用1、建Module2、改pom3、写yml4、主启动5、业务类新建远程调用接口新建业务层6、项目结构图7、测试OpenFeign实现其他负...

Java大侠 阅读(965)