
安装 Windbg 简单运用
软件安装列表
1.Visual Studio 2022: 安装 .NET Framework 4.8, .NET 6.0.5 ,支持 C++ 模板
2.Visual Studio Code:方便查看 CoreCLR 源码
3.Windbg Preview:从 微软商店 下载即可
4.CLR源码:可从 github :https://github.com/dotnet/runtime/releases/tag/v6.0.5 处下载(请根据自己的dotnet版本下载对应的源码)
5.推荐书籍:.NET高级调试(mario),汇编语言(王爽)
下载Windbg
访问Windows调试进行下载Windbg工具。
安装好后打开我们的Windbg。
接下来配置我们的符号以及调试.net的源码目录。
通过如下点击的路径来找到我们的
首先在我们的默认源路径上设置我们的源码路径。(D:\Download\runtime-6.0.3\src\coreclr
)
然后设置符号路径。(SRV*d:\mysymbols_fix*http://msdl.microsoft.com/download/symbols
)
最后加载我们的sos.dll
(D:\Download\sos\sos64\sos.dll
)
关于sos.dll
,它在可以通过dotnet-sos
工具来安装(请参考),也可以从我下面的云盘直接下载密码:qyvh。
注意我这里载入的64的,如果程序是86的请直接加载86的也是没问题的。
关于通过命令获取sos。
# 安装dotnet sos
dotnet tool install --global dotnet-sos
更多平台的安装大家可以参考黄老师的这篇文章:https://www.cnblogs.com/huangxincheng/p/12853849.html
简单测试
我们创建一个简单的项目,代码如下。
using System.Diagnostics;
namespace Example_0_2
{
internal class Program
{
static void Main(string[] args)
{
// 创建一个断点
Debugger.Break();
// 触发GC回收
GC.Collect();
// 输出Hello, World!
Console.WriteLine("Hello, World!");
}
}
}
然后我们在生成该项目之后,使用Windbg运行,并且通过sxe ld coreclr
命令在coreclr加载进来后拦截。
然后执行g
命令继续运行。
我们可以通过.chain
命令来查看加载的插件有哪些。
如果我们不希望加载某个组件可以通过.unload xxx
来去掉,以及通过.load xxx
来进行加载。
.unload D:\Download\sos\sos64\sos.dll
.chain
.load D:\Download\sos\sos64\sos.dll
.chain
我们还可以通过输入.cls
命令来清理我们的命令窗口。
我们可以通过!sos.help
来查看sos插件的帮助命令。(其他插件大多数一样的!<插件名>.help
)
接下来我们可以通过!bpmd
命令来为托管程序下断点。举个栗子。
# 命令格式
# !bpmd <程序dll名> <名称空间>.<类名>.<方法名>
# 命令为
!bpmd Example_0_2 Example_0_2.Program.Main
# 继续执行
g
我们可以看到它在方法入口处断住了,并且在我们右下的Breakpoint窗口中也有明确的断点信息。
然后我们可以通过!clrstack
命令查看托管代码的调用栈。
随后通过点击IP地址,可以查看到它所对应的汇编代码。等同于命令!U /d 00007ffa3b282bf0
,不加/d
也可以。
-a
参数是将它的参数信息打出来。
!clrstack -a
在我们代码中有关于GC清理触发,我们可以通过如下bp命令来断点GC触发的情况。
bp coreclr!WKS::GCHeap::GarbageCollectGeneration
g
g
我们发现断在了GC回收那一行,并显示出了对应的源码。
记不住命令可以通过x
命令去搜索。
x coreclr!*Garbage*
我们再通过!clrstack
查看我们的栈执行到哪儿了,并且通过k
命令查看线程栈的方式来看是通过Program.Main
下面调用System.GC.Collect方法触发了当前断点的WKS:
。:GarbageCollectGeneration
同样的我们可以通过gen变量发现是第二代gc(Locals窗口,以及代码中断点停留的方法里面),并且是通过诱导的方式触发的(reason_induced(1)
),不是自愿的。
我们同时也可以通过dv /v
命令来查看。
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739


剑轩
这个很强,很秀的感觉