Windbg程序调试系列1-经常使用命令说明&示例

Windbg程序调试是.Net高级开发须要掌握的必备技能,分析内存泄露、分析高CPU、分析线程阻塞、分析内存对象、分析线程堆栈、Live Dedugging。这个领域能够说一个技能+场景化应用的结合,若是单学Windbg命令,不理解实际Troubleshooting中的做用,是没有意义的。因此,准备搞个系列文章,3~5篇,分享给你们:html

工欲善其事必先利其器,咱们先从经常使用的命令和示例提及。windows

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】spa

 

打开以后,Ctrl+D,打开第一步抓的Dump文件,开始今天的经常使用命令介绍。插件

1. 加载SOS调试扩展dll线程

.loadby sos clr

2. 设置并从新加载调试符号文件的命令,将.Net 一些重要的pdb文件下载到指定的路径中,加载到Windbg调试环境中,这样,咱们就能够看到程序在哪一行出错,运行到哪一行了调试

1 .symfix+ C:\symbols
2 .reload

3. 打印当前调试符号文件搜索路径code

0:000> .sympath

 4. 查看线程池,分析并确认CPU使用率,可使用哪一个指令htm

0:000> !threadpool
CPU utilization: 2%
Worker Thread: Total: 19 Running: 2 Idle: 17 MaxLimit: 32767 MinLimit: 4
Work Request in Queue: 0
--------------------------------------
Number of Timers: 2
--------------------------------------
Completion Port Thread:Total: 4 Free: 4 MaxFree: 8 CurrentLimit: 4 MaxLimit: 1000 MinLimit: 4对象

5. 查看线程的总体运行状况

!threads

6. 查询指定线程的调用堆栈,例如34号线程

 ~34s

!clrstack

7. 查看线程消耗CPU资源状况

!runaway

第一列是线程号,第二列是Total的CPU使用时间

8. 查看当前线程栈上全部对象的信息,Dump stack objects

!dso

9. 查询内存中指定对象的信息 Dump object

!do

10. 查询内存中指定数组对象的信息 Dump Array

!da

11. 查看当前线程的堆栈和每行堆栈上的变量信息

!clrstack -a

12. Windbg 附加进程调试,启用CLR异常捕获、查看异常、查看异常所在线程堆栈、禁用CLR异常调试、退出调试

sxe clr
g
!pe
!clrstack
sxd clr
qd

13. 查看托管堆上内存对象的分布、三个代的信息

!eeheap -gc

14. 查看托管堆上加载的Dll

!eeheap -loader

15. 什么是内存对象代提高,垃圾回收中未回收的对象也称为幸存者,并会被提高到下一代。经过代提高的状况,能够分析对象的存活时间

 

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

!dumpheap  -stat

 17. 查询内存中大对象的个数和对象大小

!dumpheap -stat  -mt -min 85000

18. 查看内存的析构队列的指令

!finalizequeue

19. 请输入查看对象000000123557DFC0的gcroot的指令

!gcroot 000000123557DFC0

20. 查看线程阻塞的指令

!syncblk

21. 查看Dump中全部System.Net.Sockets.Socket对象统计信息的指令

!dumpheap -type System.Net.Sockets.Socket -stat

 

还有不少,同时Windbg还支持Mex扩展插件,能够参考我博客中的连接:

Windbg-Mex扩展使用总结

 

接下来,我会之内存泄露的场景,给你们分享Windbg分享的思路和方法。

 

周国庆

2018/10/28

相关文章
相关标签/搜索