Windbg程序调试系列1-常用命令说明Mex扩展使用总结
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文件,开始今天的常用命令介绍。
1. 加载SOS调试扩展dll
.loadby sos clr
2. 设置并重新加载调试符号文件的命令,将.Net 一些重要的pdb文件下载到指定的路径中,加载到Windbg调试环境中,这样,我们就可以看到程序在哪一行出错,运行到哪一行了
1 .symfix+ C:\symbols 2 .reload
3. 打印当前调试符号文件搜索路径
0:000> .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 85000
18. 查看内存的析构队列的指令
!finalizequeue
19. 请输入查看对象000000123557DFC0的gcroot的指令
!gcroot 000000123557DFC0
20. 查看线程阻塞的指令
!syncblk
21. 查看Dump中所有System.Net.Sockets.Socket对象统计信息的指令
!dumpheap -type System.Net.Sockets.Socket -stat
------------------------------------------------------------------------------------------------------------------------------------------------------------
最近一直在频繁使用Windbg做线上Dump调试,与微软做Case交流的时候,发现微软CSS团队,用了一个非常效率的Windbg 插件,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
6. 查看当前线程的异常
!mex.pe2
7. Foreach
!foreachobject -x
"!do2 @#Obj"
System.Net.Socke
Windbg程序调试系列1-常用命令说明Mex扩展使用总结相关推荐
- Android调试系列之dumpsys命令
Android调试系列之dumpsys命令 版权声明:本文为[viclee]原创,如需转载请注明出处~ https://blog.csdn.net/goodlixueyong/article/deta ...
- Windbg程序调试--转载
https://www.cnblogs.com/fang-beny/p/3582653.html Windbg程序调试--转载
- Docker系列之常用命令操作手册
Docker系列之常用命令操作手册 继上一篇博客Docker系列之原理简单介绍之后,本博客对常用的Docker命令进行实践 文章目录 1.安装虚拟机 2.安装Docker 3.Docker镜像操作 4 ...
- Linux系列 Linux常用命令(2)
作者简介:一名在校云计算网络运维学生.每天分享网络运维的学习经验.和学习笔记. 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页 目录 前言 一.Linux常用命令后续 1.创建目录 ...
- Unity ADB调试和一些常用命令
将AndroidSDK中的platform-tools路径加入系统环境变量中,就cmd下任何路径都可以使用adb 手机改成开发者模式,并且开启USB调试和USB安装 打开cmd,adb forward ...
- Hadoop系列-Hadoop常用命令(五)
Hadoop 常用命令 所有的 Hadoop 命令均由 bin/hadoop 脚本引发.不指定参数运行hadoop脚本会打印所有命令的描述. 用法: hadoop [--config confdir] ...
- 认真看完就会系列——CentOS常用命令
文章目录 一.概述及环境搭建 二.常用的基本命令(必掌握) 目录管理 基本属性 文件内容查看 三.Vim编辑器使用及账号用户管理 账号管理 用户组管理 磁盘管理 四.三种软件安装方式及服务器基本环境搭 ...
- IBM V系列存储常用命令
存储配置命令 1.设置服务IP: ----------------------------------------------------------------------------------- ...
- ADB调试方法及常用命令
无线adb的使用(平板和电脑要在同一网段) 1.插上USB后,在cmd中设置TCP/IP端口号位5555 C:\Users\Administrator>adb tcpip 5555 restar ...
- android命令大全 pdf,android调试桥(adb)常用命令.pdf
Android 调试桥 (adb) 是多种用途的工具,该工具可以帮助你管理设备或模拟器的状态. 可以通过下列几种方法加入 adb: 在设备上运行 shell 命令 通过端口转发来管理模拟器或设备 从模 ...
最新文章
- 基于Win32Api创建窗口程序
- HTTP知识普及系列:HTTP返回状态码
- c语言学生管理系统write to a text file,语言编程学生成绩管理系统.doc
- Leetcode每日一题:452.minimum-number-of-arrows-to-burst-balloons(最少数量的箭引爆气球)
- Django网站管理--ModelAdmin
- 【专家访谈】测试专家 - 陈林钧,访谈问题收集中
- Merged Manifest官方文档
- mysql如何设置host_如何快速修改MySQL用户的host属性
- [转]c#对象的浅拷贝和深拷贝
- 划片机操作安全注意事项
- 【模式匹配】之 —— Z-BOX算法
- 数字改造有色金属产业链,发挥产业优势效能
- 泰坦尼克号幸存者预测(分类)
- SQLServer The datediff function resulted in an overflow
- 全球与中国线路型避雷器市场发展前景与投资战略规划分析报告2022~2028年
- Burnside引理Pólya定理
- 基于python的Django框架购物商城设计与实现毕业设计毕设参考
- SQL Server 行转列
- 【ESP32Arduino+MPU6050 dmp姿态解算】学习笔记 PlatformIO 复制即可使用
- 中国乡镇的生产力价值,是如何被拼多多重新定义的?