安装 Windbg 简单运用 电脑版发表于:2022/8/24 16:35 ![](https://img.tnblog.net/arcimg/hb/0f6f3d2d518b43969c64320d9e4d69d6.png) ># 安装 Windbg 简单运用 [TOC] ## 软件安装列表 tn2>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),汇编语言(王爽) ![](https://img.tnblog.net/arcimg/hb/eba4441fc43e424e910c2531861375a5.png) ## 下载Windbg tn2>访问<a target="_blank" href="https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/debugger-download-tools">Windows调试</a>进行下载Windbg工具。 安装好后打开我们的Windbg。 ![](https://img.tnblog.net/arcimg/hb/c03d09815a1846b984e149b66a126378.png) tn2>接下来配置我们的符号以及调试.net的源码目录。 通过如下点击的路径来找到我们的 ```mermaid graph LR; File-->Setting Setting-->Debugging_settings ``` ![](https://img.tnblog.net/arcimg/hb/d8cdf161509042b1868e1fbe60f50642.png) tn2>首先在我们的默认源路径上设置我们的源码路径。(`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`)<br/> 关于`sos.dll`,它在可以通过`dotnet-sos`工具来安装(<a target="_blank" href="https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-sos">请参考</a>),也可以从我下面的<a target="_blank" href="https://pan.baidu.com/s/17axwTP7n4nlMAK_oRwYFoA?pwd=qyvh">云盘直接下载</a>密码:qyvh。 注意我这里载入的64的,如果程序是86的请直接加载86的也是没问题的。 关于通过命令获取sos。 ```bash # 安装dotnet sos dotnet tool install --global dotnet-sos ``` tn2>更多平台的安装大家可以参考黄老师的这篇文章:https://www.cnblogs.com/huangxincheng/p/12853849.html ## 简单测试 tn2>我们创建一个简单的项目,代码如下。 ![](https://img.tnblog.net/arcimg/hb/c891e6607f3949c8a254b1095eea2bcf.png) ```csharp 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!"); } } } ``` tn2>然后我们在生成该项目之后,使用Windbg运行,并且通过`sxe ld coreclr`命令在coreclr加载进来后拦截。 然后执行`g`命令继续运行。 ![](https://img.tnblog.net/arcimg/hb/d5e5bcf4f94a4270a502d119a3017851.png) ![](https://img.tnblog.net/arcimg/hb/86795bfc56df40499bf5f9bb7de85d6b.png) tn2>我们可以通过`.chain`命令来查看加载的插件有哪些。 ![](https://img.tnblog.net/arcimg/hb/50ebe0b7313a4c9d8e97e861cb77011d.png) tn2>如果我们不希望加载某个组件可以通过`.unload xxx`来去掉,以及通过`.load xxx`来进行加载。 ```bash .unload D:\Download\sos\sos64\sos.dll .chain .load D:\Download\sos\sos64\sos.dll .chain ``` ![](https://img.tnblog.net/arcimg/hb/003a13a1edbd4fc4b7f776d88fc2657c.png) tn2>我们还可以通过输入`.cls`命令来清理我们的命令窗口。 ![](https://img.tnblog.net/arcimg/hb/14edacebe9bd47138064f133926212de.png) tn2>我们可以通过`!sos.help`来查看sos插件的帮助命令。(其他插件大多数一样的`!<插件名>.help`) ![](https://img.tnblog.net/arcimg/hb/9879371a5a254a3a9c1bc66578ac8bec.png) tn2>接下来我们可以通过`!bpmd`命令来为托管程序下断点。举个栗子。 ```bash # 命令格式 # !bpmd <程序dll名> <名称空间>.<类名>.<方法名> # 命令为 !bpmd Example_0_2 Example_0_2.Program.Main # 继续执行 g ``` ![](https://img.tnblog.net/arcimg/hb/052d84926caf4b9da13aa0b12be12e22.png) tn2>我们可以看到它在方法入口处断住了,并且在我们右下的Breakpoint窗口中也有明确的断点信息。 ![](https://img.tnblog.net/arcimg/hb/ab8277784d034388a914214524d38703.png) tn2>然后我们可以通过`!clrstack`命令查看托管代码的调用栈。 随后通过点击IP地址,可以查看到它所对应的汇编代码。等同于命令`!U /d 00007ffa3b282bf0`,不加`/d`也可以。 ![](https://img.tnblog.net/arcimg/hb/89c08a239133450594d7bd4f5cbebec2.png) tn2>`-a`参数是将它的参数信息打出来。 ```bash !clrstack -a ``` ![](https://img.tnblog.net/arcimg/hb/7d1e6f4d86b74bb59c7eb5a8dec43cb3.png) tn2>在我们代码中有关于GC清理触发,我们可以通过如下bp命令来断点GC触发的情况。 ```bash bp coreclr!WKS::GCHeap::GarbageCollectGeneration g g ``` ![](https://img.tnblog.net/arcimg/hb/7f38ceb04c4c428481de6751dd862557.png) tn2>我们发现断在了GC回收那一行,并显示出了对应的源码。 记不住命令可以通过`x`命令去搜索。 ```bash x coreclr!*Garbage* ``` ![](https://img.tnblog.net/arcimg/hb/d3bce7162b05447480f838762af655d5.png) tn2>我们再通过`!clrstack`查看我们的栈执行到哪儿了,并且通过`k`命令查看线程栈的方式来看是通过`Program.Main`下面调用System.GC.Collect方法触发了当前断点的`WKS::GCHeap::GarbageCollectGeneration`。 ![](https://img.tnblog.net/arcimg/hb/899969952614408a92556e2f5da80b06.png) tn2>同样的我们可以通过gen变量发现是第二代gc(Locals窗口,以及代码中断点停留的方法里面),并且是通过诱导的方式触发的(`reason_induced(1)`),不是自愿的。 我们同时也可以通过`dv /v`命令来查看。 ![](https://img.tnblog.net/arcimg/hb/27ba89b693cb48ccbe39d605e46e200a.png)