一、为什么学习使用Windbg调试
Windbg是在windows平台下,强大的用户态和内核态调试工具。相比较于Visual Studio,它是一个轻量级的调试工具,所谓轻量级指的是它的安装文件大小较小,但是其调试功能,却比VS更为强大。它的另外一个用途是可以用来分析dump数据。
(以上截取自百度百科,其实说白了就是因为工作中用到了才学习的。。。。。)
二、windbg的环境配置
三、栗子
首先找到一个你要解析的dmp文件,别问哪来的,说了是工作中用到的。。。。
然后打开windbg,会看到
然后点击file的Open Crash Dump,选择要解析的dmp文件,然后得到
图上的四个圈圈是有点用但没太大用的信息,其中第四个是运行时间;
之后最简单的方法就是输入:
!analyze -v
这条指令可以理解为快速解析,一般只是偶尔查下闪退问题的会这个就够了,于是得到:
得到上面的两张图,图中圈起来的地方就是程序出问题的地方,1 3是位置,2 4是原因;
四、相关的一些指令
1.与内存相关的操作指令
!eeheap –gc:正是查看GC堆得命令,查看GC堆上的内存占用是多大
!eeheap –loader:正是查看Loader堆得命令
!dumpheap –stat:就是GC堆上的统计,就看看GC堆上存活的对象是那些
!dumpheap -mt <<MethodTable address>>:查看该地址上的对象
!dumpheap –type:通过 type 参数查看内存中指定类型的对象
!gcroot +对象地址:这个命令就可以得到这个对象的"根"
!objsize +对象地址:查看对象占用多大的内存
!name2ee TestClass.exe TestClass.Program.test ://显示test方法相关的地址
!dumpmt -md 00976d48 ://得到类的成员函数详细信息
!dumpmt:找到相关MethodTable处的相关信息。
!dumpmd:根据MethodDesc找到相关模块信息,比如MethodTable.
!dumpdomain:显示所有域里的程序集,或者根据参数获取指定域。
!dumpil 00973028:// 显示这个方法被编译器编译之后的IL代码
!dumpobj(do) 012a3904: //显示一个对象的具体内容,看对象里面有什么,值是什么
!dumpmodule 1ee30010:查看某个模块的详细信息
!DumpArray: //查看数组信息
2.与CPU相关的操作指令
!threadpool:查看线程池CPU使用量,我认为WEB的比如iis应用程序池进程w3wp如果CPU使用过高,那查看线程池命令肯定看的出来过高,这个是我自己的理解,c/s的就不一定了。
!threads:查看所有托管线程情况
!clrstack:到具体某个线程后,本线程托管代码的调用栈情况
~* e !clrstack:所有线程托管代码的调用栈情况
!runaway:查看线程占用CPU时间,可以从中找到哪个线程占用时间更高。
~number s:number为具体哪个线程的ID。
!dumpstackobjects(!dso):本线程调用栈所有对象实例
!dumpdomain:显示所有域里的程序集,或者根据参数获取指定域。
!savemodule:根据具体程序集地址,把当前程序集的代码生成到指定文件
!PrintException:显示在当前线程上引发的最后一个异常错误信息
!StopOnException:在指定异常错误信息停止运行
!VerifyHeap:检查垃圾回收器堆中是否有损坏迹象,并显示找到任何错误
!SyncBlk –all:显示所有SyncBlock 结构情况