首页
视频
资源
登录
原
安装 Windbg 简单运用
5691
人阅读
2022/8/24 16:35
总访问:
1737806
评论:
1
收藏:
0
手机
分类:
windbg
 ># 安装 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),汇编语言(王爽)  ## 下载Windbg tn2>访问<a target="_blank" href="https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/debugger-download-tools">Windows调试</a>进行下载Windbg工具。 安装好后打开我们的Windbg。  tn2>接下来配置我们的符号以及调试.net的源码目录。 通过如下点击的路径来找到我们的 ```mermaid graph LR; File-->Setting Setting-->Debugging_settings ```  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>我们创建一个简单的项目,代码如下。  ```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`命令继续运行。   tn2>我们可以通过`.chain`命令来查看加载的插件有哪些。  tn2>如果我们不希望加载某个组件可以通过`.unload xxx`来去掉,以及通过`.load xxx`来进行加载。 ```bash .unload D:\Download\sos\sos64\sos.dll .chain .load D:\Download\sos\sos64\sos.dll .chain ```  tn2>我们还可以通过输入`.cls`命令来清理我们的命令窗口。  tn2>我们可以通过`!sos.help`来查看sos插件的帮助命令。(其他插件大多数一样的`!<插件名>.help`)  tn2>接下来我们可以通过`!bpmd`命令来为托管程序下断点。举个栗子。 ```bash # 命令格式 # !bpmd <程序dll名> <名称空间>.<类名>.<方法名> # 命令为 !bpmd Example_0_2 Example_0_2.Program.Main # 继续执行 g ```  tn2>我们可以看到它在方法入口处断住了,并且在我们右下的Breakpoint窗口中也有明确的断点信息。  tn2>然后我们可以通过`!clrstack`命令查看托管代码的调用栈。 随后通过点击IP地址,可以查看到它所对应的汇编代码。等同于命令`!U /d 00007ffa3b282bf0`,不加`/d`也可以。  tn2>`-a`参数是将它的参数信息打出来。 ```bash !clrstack -a ```  tn2>在我们代码中有关于GC清理触发,我们可以通过如下bp命令来断点GC触发的情况。 ```bash bp coreclr!WKS::GCHeap::GarbageCollectGeneration g g ```  tn2>我们发现断在了GC回收那一行,并显示出了对应的源码。 记不住命令可以通过`x`命令去搜索。 ```bash x coreclr!*Garbage* ```  tn2>我们再通过`!clrstack`查看我们的栈执行到哪儿了,并且通过`k`命令查看线程栈的方式来看是通过`Program.Main`下面调用System.GC.Collect方法触发了当前断点的`WKS::GCHeap::GarbageCollectGeneration`。  tn2>同样的我们可以通过gen变量发现是第二代gc(Locals窗口,以及代码中断点停留的方法里面),并且是通过诱导的方式触发的(`reason_induced(1)`),不是自愿的。 我们同时也可以通过`dv /v`命令来查看。 
欢迎加群讨论技术,群号:677373950
评价
{{titleitem}}
{{titleitem}}
{{item.content}}
{{titleitem}}
{{titleitem}}
{{item.content}}
尘叶心繁
这一世以无限游戏为使命!
博主信息
排名
6
文章
6
粉丝
16
评论
8
文章类别
.net后台框架
155篇
linux
17篇
linux中cve
1篇
windows中cve
0篇
资源分享
10篇
Win32
3篇
前端
27篇
传说中的c
4篇
Xamarin
9篇
docker
15篇
容器编排
101篇
grpc
4篇
Go
15篇
yaml模板
1篇
理论
2篇
更多
Sqlserver
4篇
云产品
38篇
git
3篇
Unity
1篇
考证
2篇
RabbitMq
23篇
Harbor
1篇
Ansible
8篇
Jenkins
17篇
Vue
1篇
Ids4
18篇
istio
1篇
架构
2篇
网络
7篇
windbg
4篇
最新文章
最新评价
{{item.articleTitle}}
{{item.blogName}}
:
{{item.content}}
关于我们
ICP备案 :
渝ICP备18016597号-1
网站信息:
2018-2023
TNBLOG.NET
技术交流:
群号677373950
联系我们:
contact@tnblog.net
欢迎加群
欢迎加群交流技术