.NET Core/.NET5时候调试基础之WinDbg 加载sos.dll调试

 大家遇到过这种情况没有,有时候bug在开发测试环境不会出现,在生产环境产生了bug,有时搞得摸不透什么情况。如果在生产环境能调试就可以了,这个还真有生产环境下事后调试,可以用WinDbg等进行事后调试,本文主要介绍WinDbg工具的使用以及加载sos.dll辅助调试的方法。.

 一、环境配置   

    首先安装WinDbg和sos工具,然后配置符号表环境变量。

1、WinDbg安装

    Windbg是在windows平台下,强大的用户态和内核态调试工具,Windbg支持的平台包括X86、IA64、AMD64。它的另外一个用途是可以用来分析dump数据。具体介绍可以查看微软官网,本文主要介绍用户模式。

    Windbg版本有两个,一个是.NET自带的版本,另一个是微软windows应用商店里Windbg。自带版本安装很简单,打开windows应用和功能,搜索Development Kit,点击修改,打开如下图:

.NET Core/.NET5时候调试基础之WinDbg 加载sos.dll调试

选择change后点击next,选择Debuggging Tools for Windows,点击下方的change即可。

.NET Core/.NET5时候调试基础之WinDbg 加载sos.dll调试

如果安装成功后在window菜单的window Kit文件夹有四个版本的WinDbg,如下图。

.NET Core/.NET5时候调试基础之WinDbg 加载sos.dll调试

另一个版本打开微软应用商店,搜索WinDbg后第一个就是,点击安装即可。如下图。

.NET Core/.NET5时候调试基础之WinDbg 加载sos.dll调试

2、.NET sos工具

SOS缩写son of strike   是strike 的子集,strike也是一个调试工具,由于安全问题推出了子集SOS,SOS是一种dump工具,可以帮助我们进行高级调试。可以用dos命令安装sos。

首先输入如下命令,注意要加版本号,否则失败,另外这只是安装工具的安装。

dotnet tool install -g dotnet-sos --version 6.0.328102

然后输入dotnet-sos install安装,如果要从 Arm64 主机运行 Arm32 二进制文件,则需要使用 dotnet-sos install --architecture Arm 安装 SOS

dotnet-sos install

安装成功后有SOS install succeeded的提示,并且返回有安装路径。

3、配置符号表环境变量

    符号表是一种存储键值对的数据结构,支持两种操作:插入(put),即将一组新的键值对存入表中;查找(get),即根据给定的键得到相应的值。符号表最主要的目的就是将一个健和一个值联系起来。调试的时候会拉取符合表来对应程序。

    打开window环境变量,输入如下

srv*C:\Symbols*https://msdl.microsoft.com/download/symbols

.NET Core/.NET5时候调试基础之WinDbg 加载sos.dll调试

其中F:\Symbols windows符号表缓存目录.

https://msdl.microsoft.com/download/symbols 这个链接是微软的官方的符号表.

查看是否配置成功,用Windbg中 open executable随便导入一个exe文件,如有如下红框,便是配置成功。

.NET Core/.NET5时候调试基础之WinDbg 加载sos.dll调试

二、使用WinDbg

    主要介绍应用商店的WinDbg使用,.net下的WinDbg没有找到更好的资料,步骤如下:

1、用vs新建一个helloworld的控制台程序,并点击生成,必须生成dll文件。我这里开始用.NET6来做,结果失败了,估计是.net6版本的控制台程序没有命名空间的原因吧。

在项目配置里增加如下命令,便于之后调试dev版本。

 <RuntimeFrameworkVersion>5.0.0-dev</RuntimeFrameworkVersion>

2、打开cmd,cd进入生成dll的目录,输入下面命令按回车键便开始进入WinDbg模式

WinDbgx dotnet .\HelloWorld.dll

.NET Core/.NET5时候调试基础之WinDbg 加载sos.dll调试

3、在命令框中输入sxe ld coreclr,以便加载coreclr。输入g命令运行,可以看到是否正确加载coreclr命令框如下图箭头。

  //g命令运行后如有如下,表示成功加载coreclr   C:\Program Files\dotnet\shared\Microsoft.NETCore.App\5.0.0\coreclr.dll

.NET Core/.NET5时候调试基础之WinDbg 加载sos.dll调试

4、加载.net sos,语法是.load+路径,路径会在安装sos完成并成功时候提示,注意记录,命令如下。输入.chain可以查看加载的组件,如果列表里有sos说明加载成功。

.load C:\Users\yourusername\.dotnet\sos\sos.dll

5、添加调试断点,以当前项目为例,格式为

!bpmd 项目.dll 项目名称.命名空间.方法,具体如下。

!bpmd HelloWorld2.dll HelloWorld.Program.Main

输入g点击回车运行,命令窗口会在HelloWorld.Program.Main方法处停止运行,如下图:

.NET Core/.NET5时候调试基础之WinDbg 加载sos.dll调试

这样的话就成功配置好了WinDbg 加载sos.dll辅助调试方法。

结语

    调试感觉在vs很容易事情,但是在生产环境就没有那么容易了,当然生产环境一般不能这样直接调试,一般会有个克隆模拟的生产的服务器,在那上面进行调试,找到具体的错误,当然可以用多个方法找出问题,比如加项目日志、抓取载入的内存等。由于篇幅有限,后面的文章将会有项目如何调试bug的内容。写作水平有限,欢迎留言讨论。