上周和大家分享了.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分享的技能。

周国庆

2021/1/17

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

  1. .NET高级调试系列-Windbg调试入门篇

    Windbg是.NET高级调试领域中不可或缺的一个工具和利器,也是日常我们分析解决问题的必备.准备近期写2篇精华文章,集中给大家分享一下如果通过Windbg进行.NET高级调试. 今天我们来一篇入门的 ...

  2. C/C++ 程序反调试的方法

    C/C++ 要实现程序反调试有多种方法,BeingDebugged,NtGlobalFlag,ProcessHeap,CheckRemoteDebuggerPresent,STARTUPINFO,Is ...

  3. Visual Studio高级调试技巧

    1. 设置软件断点,运行到目标位置启动调试器 方法①:使用汇编指令(注:x64 c++不支持嵌入汇编) _asm 方法②:编译器提供的方法 __debugbreak(); 方法③:使用windows ...

  4. [Android Studio 权威教程]断点调试和高级调试

    好了开始写一个简单的调试程序,我们先来一个for循环 ? 1 2 3 4 5 6 7 8 <code class="language-java hljs ">for ( ...

  5. ###Android 断点调试和高级调试###

    转自:http://www.2cto.com/kf/201506/408358.html 有人说Android 的调试是最坑的,那我只能说是你不会用而已,我可以说Android Studio的调试是我 ...

  6. 无法在web服务器上启动调试,服务器不支持对ASP.NET 或ATL Server应用程序进行调试。

    无法在web服务器上启动调试,服务器不支持对ASP.NET 或ATL Server应用程序进行调试. a>.DCOM配置里的属性灰色不可用的解决方法,   1>.管理工具->组件服务 ...

  7. Delphi应用程序的调试(五)其他调试工具

    Delphi应用程序的调试(五)其他调试工具 Delphi7中提供了一些附加调试工具来帮助用户检查程序错误.从性能上讲,其中一些工具属于高级调试工具.尽管高级调试工具不像其他工具那样常用,但对于经验丰 ...

  8. Android Stuido中断点调试和高级调试

    写一个简单的调试程序 import android.os.Bundle; import android.support.v7.app.AppCompatActivity; public class M ...

  9. Linux高级调试与优化——gdb调试命令

    番外 2019年7月26日至27日,公司邀请<软件调试>和<格蠹汇编——软件调试案例集锦>两本书的作者张银奎老师进行<Linux高级调试与优化>培训,有幸聆听张老师 ...

随机推荐

  1. 操作系统精髓与设计原理(九)——I/O管理和磁盘调度

    文章目录 I/O设备 I/O功能组织 直接存储器访问 操作系统设计问题 设计目标 IO功能的逻辑结构 I/O缓冲 单缓冲 双缓冲 循环缓冲 缓冲的作用 磁盘调度 磁盘性能参数 磁盘调度策略 先进先出 ...

  2. 圆周率PI

    import math import time scale=30 s,m,=1,2 total,s,n,t=0.0,1,1.0,1.0 print("执行开始".center(sc ...

  3. kafka监控之topic的lag情况监控

    需求描述:lag(滞后)是kafka消费队列性能监控的重要指标,lag的值越大,表示kafka的堆积越严重.本篇文章将使用python脚本+influxdb+grafana的方式对kafka的offs ...

  4. Spring MVC或Spring Boot配置默认访问页面不生效?

    相信在开发项目过程中,设置默认访问页面应该都用过.但是有时候设置了却不起作用.你知道是什么原因吗?今天就来说说我遇到的问题. 首先说说配置默认访问页面有哪几种方式. 1.tomcat配置默认访问页面 ...

  5. 谁再问Servlet的问题,我就亲自上门来教学了

    1. 概述 在这篇简短的文章中,我们将从概念上理解什么是servlet 和 servlet 容器以及它们是如何工作的. 同时,还能在请求.响应.会话对象.共享变量和多线程的上下文中看到它们的身影. 2 ...

  6. js上 二十、综合案例

    二十.综合案例 题目一: **1. ** 数组随机 描述,写randomArray函数,传递一个数组,传递一个数值,返回一个指定个数的随机的新数组,不允许有重复数据 用例: randomArray([ ...

  7. [日常摸鱼]HDU1724 Ellipse-自适应Simpson法

    模板题~ QAQ话说Simpson法的原理我还是不太懂-如果有懂的dalao麻烦告诉我~ 题意:每次给一个椭圆的标准方程,求夹在直线$x=l$和$x=r$之间的面积 Simpson法 (好像有时候也被 ...

  8. 逆袭故事|从“点点点”到月薪17K,这个女孩子做到啦

    姓:XXX,XX VIP 学员,一名自动化测试工程师!之前在某大型培训机构转行学习软件测试时就是木子老师的学生,她也一直关注木子老师的动态,后来知道木子老师打算开设测试开发高级提升班,等开了班就报名了 ...

  9. 为什么 HashMap 的容量大小要设置为2的N次方?

    原文链接:https://www.changxuan.top/?p=1208 前两天,我在一位同学提交中看到了下面这样的一行代码,让我很是惊讶. Map<String, String> t ...

  10. PHP 直接使用html输出excel

    1 <?php 2 header("Cache-Control:public"); 3 header("Pragma:public"); 4 5 head ...