上周和大家分享了.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 ]

架构有以下选项:

  • 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(); 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

标签:

.NET 5 程序高级调试-WinDbg的更多相关文章

  1. .NET 调整图片尺寸(Resize)各种方法

    本文中如无特别说明 .NET 指 .NET 5或者更高版本,代码同样可用于 .NET Core前言调整图片尺寸最常用......

  2. .NET 5 程序高级调试-WinDbg

    上周和大家分享了.NET 5开源工作流框架elsa,程序跑起来后,想看一下后台线程的执行情况。抓了个进程Dump后,......

  3. .Net Winform控件TreeView最简递归绑定方法

    前言:Treeview控件是我们在WinForm、WebForm开发中经常使用的控件,需要从数据库动态加载数据,然后......

  4. Ocelot一个优秀的.NET API网关框架

    1 什么是Ocelot?Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由、请......

  5. .NET的并发编程(TPL编程)是什么?

    写在前面优秀软件的一个关键特征就是具有并发性。过去的几十年,我们可以进行并发编程,但是难度很大。以前,并发性软件的编......

  6. C# 调用FFmpeg处理音视频的示例

    FFmpeg 开源、跨平台、体积小、功能强大,提供了录制、转换以及流化音视频的完整解决方案。官网:https:/......

  7. ASP.NET Core 3.1 中间件

    参考微软官方文档 :https://docs.microsoft.com/zh-cn/aspnet/core/fun......

  8. ASP.NET Core错误处理中间件[2]: 开发者异常页面

    异常页面的DeveloperExceptionPageMiddleware中间件,该中间件在捕捉到后续处理过程中抛出......

  9. .NET斗鱼直播弹幕客户端(2021)

    之前的.NET斗鱼弹幕不能用了?看这篇文章即可。.NET斗鱼直播弹幕客户端(2021)离之前更新的两篇《.NET斗鱼......

  10. 浅谈ASP.NET Core中IOC与DI的理解和使用

    说起IOC和DI,使用过ASP.NET Core的人对这两个概念一定不陌生,早前,自己也有尝试过去了解这两个东西,但......

随机推荐

  1. 如何实现短信跳转小程序?

    先看效果小程序支持短信跳转小程序了,可以说是打开了一个巨大的流量入口。效果过程分析从短信到网页从网页到小程序那么就涉......

  2. php中数组最简单的使用方法

    我们在说映射的时候,有些小伙伴就会联想到数组,没错,因为数组就是用了映射的思想。这里很多刚学php的小伙伴对概念不是......

  3. php中__call()方法使用

    <无详细内容>"","where"=>"&quo......

  4. java中ExecutorService创建方法总结

    在对线程进行控制时,Executor虽然能够对其进行管理,但是缺少终止的功能,所以我们要用到Executor的进阶方......

  5. C# 实现在当前目录基础上找到上一层目录

    其实很简单也很无脑,但却很实用,就是使用拆字符串的方法:/// /// 获得项目的根路径/// /// public......

  6. 详解JavaScript中的链式调用

    链模式链模式是一种链式调用的方式,准确来说不属于通常定义的设计模式范畴,但链式调用是一种非常有用的代码构建技巧。描述......

  7. 深入了解MySQL主从复制的原理

    欢迎微信关注「SH的全栈笔记」0. 主从复制首先主从复制是什么?简单来说是让一台MySQL服务器去复制另一台MySQ......

  8. C#中DataGridView导出Excel的两种方法

    第一种是用数据流导出:#regionSaveFileDialog saveFileDialog = new Save......

  9. Java多线程总结(二)

    四.Java多线程的阻塞状态与线程控制上文已经提到Java阻塞的几种具体类型。下面分别看下引起Java线程阻塞的主要......

  10. 基于 Python 实践感知器分类算法

    Perceptron是用于二进制分类任务的线性机器学习算法。它可以被认为是人工神经网络的第一种和最简单的类型之一。绝......