zoukankan      html  css  js  c++  java
  • [草稿]Windbg常用命令及分析套路

    前段时间陆陆续续在追查服务端程序卡死的问题,最终通过dump分析找到原因。

    过程中整理了一些Windbg的常用命令和基本套路,先把草稿发来备忘。


    常用

    !threadpool               查看线程池CPU使用量

    !threads                     查看所有托管线程情况

    !clrstack                     某个线程托管代码的调用栈情况

    ~*e!clrstack              所有线程托管代码的调用栈情况

    !runaway                   查看线程占用CPU时间

    ~<number> s             切换到指定线程(number为具体哪个线程的ID)

    !dumpstackobjects(!dso)  本线程调用栈所有对象实例

    !dumpdomain           显示所有域里的程序集,或者根据参数获取指定域。

    !savemodule             根据具体程序集地址,把当前程序集的代码生成到指定文件

    !PrintException(!pe)  显示在当前线程上引发的最后一个异常错误信息

    !VerifyHeap               检查垃圾回收器堆中是否有损坏迹象,并显示找到任何错误

    !SyncBlk –all              显示所有SyncBlock 结构情况

    查看对象

    基本

    !DumpObj <对象地址>                      查看对象

    !DumpArray <对象地址>                  查看数组

    !sosex.mdt <对象地址>                    查看对象

    !sosex.mdt -e <对象地址>               查看数组

    !netext.wdo <对象地址>                  查看对象

    限定大小

    !dumpheap -min <size1 bytes > -max <size2 bytes>     查看大小在size1~size2的对象

    !dumpheap -min <size bytes >                                   查看大于size字节的对象

    限定类型

    !dumpheap -mt <MethodTable address>-min <size1 bytes > -max <size2 bytes>

    查看MethodTable结构的对象

    !dumpheap –type <partial type name>

    查看类型名字子串匹配指定字符串的对象

    限定地址范围

    !dumpheap start [end]         查看指定地址范围的对象

    查看内存

    !eeheap -gc                         查看GC堆,查看GC堆上的内存占用是多大

    !eeheap –loader                查看Loader堆

    !dumpheap –stat              GC堆上的统计,看GC堆上存活的对象是那些

    !dumpheap -mt <MethodTable address>        查看该地址上的对象

    !dumpheap –type             通过 type 参数查看内存中指定类型的对象

    !gcroot <对象地址>        得到这个对象的引用"根"

    !objsize <对象地址>        查看对象占用多大的内存(不一定准)

    !name2ee TestClass.exeTestClass.Program.test         //显示test方法相关的地址

    !dumpmt -md 00976d48                                              //得到类的成员函数详细信息

    !dumpmt                             找到相关MethodTable处的有关信息

    !dumpmd                   根据MethodDesc找到相关模块信息,比如MethodTable.

    !dumpdomain                    显示所有域里的程序集,或者根据参数获取指定域。

    !dumpil 00973028             显示这个方法被编译器编译之后的IL代码

    !dumpmodule 1ee30010 查看某个模块的详细信息

    检查GC的终结队列及线程

    !FinalizeQueue         显示为终结(finalization)而登记的所有对象。

                          重点看“Ready for finalization XX objexts”

    !ThreadPool              显示托管线程池的有关信息。

    如果“CPU utilization 81%”表示当前很可能在执行GC回收,此时Work Request in Queue会增长(因为CPU超过80%不会创建新线程)。

    !Threads                    显示进程中所有的托管线程。

    关注Exception列,标记为“(Finalizer)”的表示这条为终结器线程、标记有“(GC)”的表示这条线程上在执行GC操作、

    查看线程调用

    查看调用堆栈,然后进一步查看相关调用方法的参数,推断调用逻辑

    ~<线程>e!clrstack                        查线程调用堆栈

    ~*e!clrstack                                     查所有线程调用堆栈

    ~<线程>e!clrstack –a                查线程调用堆栈(含参数对象地址)

    ~<线程>e!dso                                     查线程上所有对象–>根据类型找到要查看对象的地址

    !do <对象地址>                                  查看对象信息

    !sosex.mdt–e <对象地址>  查看对象信息(数组)

    查看异常

    PrintException [-nested][<Exception object address>]

    -或者-

    PE [-nested][<Exception object address>]

    编排格式并显示在指定地址上的任何Exception类派生对象的字段。如果你没有指定一个地址,PrintException命令显示当前线程上最近抛出的异常。

    -nested 选项详细显示嵌套的异常对象。

    你可以使用这个命令编排格式并查看_stackTrace字段,这是一个二元数组。

    !analyze -v -hang

           displays information about the currentexception or bug check.

    .foreach (ex{!dumpheap -type Exception -short}){.echo“********************************”;!pe -nested ${ex} }

    定位“锁”

    !sosex.dlk       检查死锁

    !SyncBlk           


     

    扩展

    sosex

    http://www.stevestechspot.com/default.aspx

    先创建堆上对象的索引!bhi

    !mdt -e 00000000450bc560

    netext

    http://netext.codeplex.com/SourceControl/latest

    Psscor4

    https://www.microsoft.com/en-us/download/details.aspx?id=21255

    编写Windbg扩展

    https://www.codeproject.com/Articles/6522/Debug-Tutorial-Part-Writing-WINDBG-Extensions

  • 相关阅读:
    [20160701]DevideByZeroWithoutNoException——from 《Java How To Program (Early Objects), 10th》
    Linux/Centos下安装部署phantomjs 及使用
    SVG中 transform矩阵遇到的兼容性问题
    jQuery中clone和clone(true)的区别
    彻底删除MySQL
    安卓工程师笔试--2015--波导公司
    如何查看、备份电脑隐藏的恢复分区
    效率以及时间维度
    数据集市设计
    Python学习之一:Python2.7与opencv2.4安装配置
  • 原文地址:https://www.cnblogs.com/fj365/p/13295453.html
Copyright © 2011-2022 走看看