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

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

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文件,开始今天的常用命令介绍。

1. 加载SOS调试扩展dll

.loadby sos clr

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

 .symfix+ C:\symbols
.reload

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

:> .sympath

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

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 

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

Windbg程序调试系列1-常用命令说明&示例的更多相关文章

  1. Windbg程序调试系列-索引篇

    最近整理了一下Windbg程序调试系列的文章,做个了索引贴,方便大家查询.搜索: Windbg程序调试系列1-常用命令说明&示例 Windbg程序调试系列1-Mex扩展使用总结 Windbg程 ...

  2. Windbg程序调试系列5-高CPU问题分析

    上篇博客中给大家分享了使用Windbg进行Live Debugging: Windbg程序调试系列4-Live Debugging 本篇中我们继续,跟大家分享常见的应用程序高CPU使用率问题分析. 先 ...

  3. Windbg程序调试系列4-Live Debugging

    上篇博文中给大家分享了使用Windbg分析线程阻塞问题: Windbg程序调试系列3-线程阻塞问题 本篇中我们继续,跟大家分享附加进程实时调试-Live Debugging. 先说一下使用Windbg ...

  4. Windbg程序调试系列3-线程阻塞问题

    上一篇博文给大家分享了使用Windbg分析内存泄露问题: Windbg程序调试系列2-内存泄露问题 本篇我们继续跟大家分享,如何分析解决线程阻塞问题. 从根本上讲,线程阻塞属于程序Hang的一种,其表 ...

  5. Windbg内核调试之二: 常用命令

    运用Windbg进行内核调试, 熟练的运用命令行是必不可少的技能. 但是面对众多繁琐的命令, 实在是不可能全部的了解和掌握. 而了解Kernel正是需要这些命令的指引, 不断深入理解其基本的内容. 下 ...

  6. Windbg程序调试系列1-Mex扩展使用总结

    最近一直在频繁使用Windbg做线上Dump调试,与微软做Case交流的时候,发现微软CSS团队,用了一个非常效率的Windbg 插件,Mex: 使用介绍: https://blogs.msdn.mi ...

  7. Windbg程序调试系列2-内存泄露问题

    上篇文章给大家解释了Windbg的基本命令和说明,这一篇给大家介绍内存泄露场景的问题分析. 文章大纲: 描述问题背景和现象 确定问题是否是内存泄露 梳理问题分析思路 动手分析解决 总结 1. 先说问题 ...

  8. Windows程序调试系列: 使用VC++生成调试信息 转

    Windows程序调试系列: 使用VC++生成调试信息 ZhangTao,zhangtao.it@gmail.com, 译自 “Generating debug information with Vi ...

  9. Hexo系列(三) 常用命令详解

    Hexo 框架可以帮助我们快速创建一个属于自己的博客网站,熟悉 Hexo 框架提供的命令有利于我们管理博客 1.hexo init hexo init 命令用于初始化本地文件夹为网站的根目录 $ he ...

随机推荐

  1. Vue+Vue-router微信分享功能

    在使用vue和vue-router路由框架已经开发过好几个项目了,其中也遇到不少坑,有些坑各种搜也没有找到非常理想的答案. vue学习相对来说还是比较简单,官方文档说明非常清楚(https://cn. ...

  2. java相对路径、绝对路径及类路径

    import java.io.File; import java.net.URL; /** * java相对路径.绝对路径及类路径的测试 */ public class Test { /** * 测试 ...

  3. ES6 扩展运算符 三点(...)

    含义 扩展运算符( spread )是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(...[, , ]) // 1 2 3 conso ...

  4. docker应用-3(搭建hadoop以及hbase集群)

    要用docker搭建集群,首先需要构造集群所需的docker镜像.构建镜像的一种方式是,利用一个已有的镜像比如简单的linux系统,运行一个容器,在容器中手动的安装集群所需要的软件并进行配置,然后co ...

  5. [Golang] 开源一个帧同步服务器

    具体看README吧 https://github.com/bailu1901/lockstepserver

  6. web.py框架之高级应用

    二.高级应用 2.1 web.ctx 获取客户端信息,比如:来源页面.客户端浏览器类型等. web.ctx基于 threadeddict类,又被叫做 ThreadDict.这个类创建了一个类似字典(d ...

  7. 在elementUI中使用 el-autocomplete 实现远程搜索的下拉框

    参考;https://blog.csdn.net/qq_37746973/article/details/78402812?utm_source=blogxgwz1 https://blog.csdn ...

  8. P1115 最大子段和

    题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 第一行是一个正整数NNN,表示了序列的长度. 第二行包含NNN个绝对值不大于100001000010000的 ...

  9. Spring-Boot自动装载servlet

    Spring-Boot自动装载servlet 本人spring-boot相关博客均自己手动编写,但技术均从简书 恒宇少年 处学习,该大佬一直是我的偶像,鉴于能充分理解,所以已做笔记的方式留下这些文档, ...

  10. cmd运行java程序---路径容易出错的问题

    初学者在首次使用cmd运行java程序时面临着很多的问题,重要的基本为“设置环境变量过程”与运行过程中的“路径出错问题”.由于环境变量设置的网络分享更多,且为大众情况,因此比较容易解决!   由于本人 ...