.NET 5 程序高级调试-WinDbg

dotNET全栈开发

共 4162字,需浏览 9分钟

 ·

2021-02-21 21:33


转自:Eric zhou
cnblogs.com/tianqing/p/14289170.html

前言


之前和大家分享了.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的测试工程了:



测试代码:


using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Threading.Tasks;
using Elsa.Activities.Console.Activities;
using Elsa.Activities.Console.Extensions;
using Elsa.Activities.Timers.Extensions;
using Elsa.Expressions;
using Elsa.Extensions;
using Elsa.Services;
using NodaTime;

namespace ElsaRecurringTaskWorkflow
{
using Elsa.Activities.Console.Extensions;
class Program
{
static async Task Main(string[] args)
{
var host = new HostBuilder()
.ConfigureServices(ConfigureServices)
.ConfigureLogging(logging => logging.AddConsole())
.UseConsoleLifetime()
.Build();
using (host)
{
await host.StartAsync();
await host.WaitForShutdownAsync();
}
}
private static void ConfigureServices(IServiceCollection services)
{
services
.AddElsaCore()
.AddConsoleActivities()
.AddTimerActivities(options => options.Configure(x => x.SweepInterval = Duration.FromSeconds(1)))
.AddWorkflow ();
}
}
}


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调试.NET 5的技术分享,下一篇将给大家继续分享Linux抓Dump分享的技能。


推荐几个不错的链接:


dotnet-sos install:https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-sos?WT.mc_id=DT-MVP-5003918


SOS调试器扩展:https://docs.microsoft.com/en-us/dotnet/core/diagnostics/sos-debugging-extension?WT.mc_id=DT-MVP-5003918


- EOF -







回复 【关闭】广
回复 【实战】获取20套实战源码
回复 【被删】
回复 【访客】访
回复 【小程序】学获取15套【入门+实战+赚钱】小程序源码
回复 【python】学微获取全套0基础Python知识手册
回复 【2019】获取2019 .NET 开发者峰会资料PPT
回复 【加群】加入dotnet微信交流群

微信终于可以免费提现了!


卧槽:微信可以这样换个字体了!


点赞和在看就是最大的支持❤️

浏览 66
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报