(精华)2020年9月6日 .NET Core 程序调试Windbg(常用命令)

Windbg程序调试是.Net高级开发需要掌握的必备技能,分析内存泄露、分析高CPU、分析线程阻塞、分析内存对象、分析线程堆栈、Live Dedugging。这个领域可以说一个技能+场景化应用的结合,如果单学Windbg命令,不理解实际Troubleshooting中的作用,是没有意义的。

工欲善其事必先利其器,我们先从常用的命令和示例说起。

  1. 先准备一个Dump文件,建议使用64位应用程序。例如:64位IIS应用的w3wp进程,64位exe进程都可以。如果抓Dump文件,很简单:任务管理器-进程-右键【创建转储文件】

  2. 下载并安装Windbg,下载链接:https://developer.microsoft.com/zh-cn/windows/downloads/windows-10-sdk,一路下一步,选择【Debugging Tools for Windows】
    在这里插入图片描述
    在这里插入图片描述
    打开之后,Ctrl+D,打开第一步抓的Dump文件,开始今天的常用命令介绍。

SOS安装

dotnet tool install -g dotnet-sos
dotnet-sos install

Windbg基本用法

  1. 加载SOS调试扩展dll
.loadby sos clr
  1. 设置并重新加载调试符号文件的命令,将.Net 一些重要的pdb文件下载到指定的路径中,加载到Windbg调试环境中,这样,我们就可以看到程序在哪一行出错,运行到哪一行了
1 .symfix+ C:\symbols
2 .reload

在这里插入图片描述
3. 打印当前调试符号文件搜索路径

0:000> .sympath
  1. 查看线程池,分析并确认CPU使用率,可以使用哪个指令
0:000> !threadpoolCPU utilization: 2%Worker Thread: Total: 19 Running: 2 Idle: 17 MaxLimit: 32767 MinLimit: 4Work Request in Queue: 0--------------------------------------Number of Timers: 2--------------------------------------Completion Port Thread:Total: 4 Free: 4 MaxFree: 8 CurrentLimit: 4 MaxLimit: 1000 MinLimit: 4
  1. 查看线程的整体运行情况
!threads

在这里插入图片描述
6. 查询指定线程的调用堆栈,例如34号线程

 ~34s

在这里插入图片描述

!clrstack

在这里插入图片描述
7. 查看线程消耗CPU资源情况

!runaway

在这里插入图片描述
第一列是线程号,第二列是Total的CPU使用时间

  1. 查看当前线程栈上所有对象的信息,Dump stack objects
!dso

在这里插入图片描述
9. 查询内存中指定对象的信息 Dump object

!do
  1. 查询内存中指定数组对象的信息 Dump Array
!da
  1. 查看当前线程的堆栈和每行堆栈上的变量信息
!clrstack -a
  1. Windbg 附加进程调试,启用CLR异常捕获、查看异常、查看异常所在线程堆栈、禁用CLR异常调试、退出调试
sxe clr
g
!pe
!clrstack
sxd clr
qd
  1. 查看托管堆上内存对象的分布、三个代的信息
!eeheap -gc

在这里插入图片描述
14. 查看托管堆上加载的Dll

!eeheap -loader
  1. 什么是内存对象代提升,垃圾回收中未回收的对象也称为幸存者,并会被提升到下一代。通过代提升的情况,可以分析对象的存活时间

  2. 查询内存中各类对象的总个数和总内存占用

!dumpheap  -stat
  1. 查询内存中大对象的个数和对象大小
!dumpheap -stat  -mt -min 85000
  1. 查看内存的析构队列的指令
!finalizequeue
  1. 请输入查看对象000000123557DFC0的gcroot的指令
!gcroot 000000123557DFC0
  1. 查看线程阻塞的指令
!syncblk
  1. 查看Dump中所有System.Net.Sockets.Socket对象统计信息的指令
!dumpheap -type System.Net.Sockets.Socket -stat

Mex扩展使用总结

使用介绍:

https://blogs.msdn.microsoft.com/luisdem/2016/07/19/mex-debugging-extension-for-windbg-2/

下载地址:

https://www.microsoft.com/en-us/download/details.aspx?id=53304

下载之后,解压缩,有两个目录,X64和X86,大家根据自己的需要进行加载,目前我们主要用X64。当然也可以直接把这个扩展拷贝到Windbg运行目录中。

这里,我们先show一下Windbg加载mex扩展:

0:000> .load D:\Mex\x64\mex.dll
Mex External 3.0.0.7172 Loaded!

当然,我们可以同时继续加载sos

0:000> .loadby sos clr

查看已经加载的扩展:
在这里插入图片描述
如果本机调试Dump,建议设置调试符号的路径:

srv*c:\symcache*http://msdl.microsoft.com/download/symbols;c:\symcache

在这里插入图片描述
查看Mex的各种命令:

0:000> !mex.help
Mex currently has 255 extensions available.  Please specify a keyword to search.
Or browse by category:

在这里插入图片描述
大家可以逐一点进去看一下。

这里我给大家show几个常用的命令:

  1. !dae 查看所有的Exception

在这里插入图片描述
2. 查看所有的线程状态

!mex.mthreads

在这里插入图片描述
3. !clrstack2 查询线程堆栈、
在这里插入图片描述
4. do2 查看对象
在这里插入图片描述
5. 查看所有的Asp.Net请求

!mex.aspxpagesext
  1. 查看当前线程的异常
!mex.pe2
  1. Foreach
!foreachobject  -x "!do2 @#Obj"  System.Net.Socket
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愚公搬代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值