Windbg程序调试系列1-常用命令说明&示例
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调试环境中,这样,我们就可以看到程序在哪一行出错,运行到哪一行了 1 .symfix+ C:symbols 2 .reload 3. 打印当前调试符号文件搜索路径 0:000> .sympath ?4.?查看线程池,分析并确认CPU使用率,可以使用哪个指令 0:000> !threadpool 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – WebApi – 请求包含实体主体但没有Content-
- asp.net-web-api – 当启用CORS时,ASP.NET Web API中的异常
- asp.net-mvc – @ Html.HiddenFor返回null值
- asp.net-mvc – 使用ASP.NET MVC导出数据到Excel文件4 C#正
- asp.net-mvc-4 – 编辑视图中多选列表框的超级简单实现
- 如何在asp.net中的gridview中添加带有按钮的列?
- asp.net – 无论如何要在上传之前确定文件大小?
- 缺少ASP.NET_SessionId
- asp.net-mvc – ASP.NET MVC WebApi:没有为此对象定义的无
- ASP.NET网站中的深度优先嵌套路由