Windgb 其他常用命令

时间:2022-09-20 18:14:30
  • .lastevent

  显示最近发生的一个调试事件,往往是导致中断发生的那个。

Windgb 其他常用命令

  • .exr:

      此命令显示一个异常记录的详细内容,传入一个异常记录地址:

  • .exr 记录地址

  如果仅仅为了显示最近的一条异常记录,可以用-1代替异常记录地址:

  • .exr -1

  由于异常是事件的一种,所以使用.exr -1命令得到的异常,可能和使用.lastevent命令获取的事件,是同一个。但二者显示的信息各有侧重点。

 Windgb 其他常用命令

  • .bugcheck

  此命令不带参数。在内核环境下,显示当前bug check的详细信息;可用于活动调试或者crash dump调试环境中。用户环境中,此命令不可用。

  • !analyze

  此命令分析当前最近的异常事件(如果在进行dump分析,则是bug check),并显示分析结果。这个异常事件,就是上面.lastevent命令对应的事件

    • -v:显示异常的详细信息,这个选项在调试错误的时候,最有用。
    • -f:f是force的缩写。强制将任何事件都当作异常来分析,即使仅仅是普通的断点事件。将因此多输出一些内容。
    • -hang:这个选项很有用,对于遇到死锁的情况,它会分析原因。在内核环境中,它分析内核锁和DPC栈;在用户环境中,它分析线程的调用栈。用户环境中,调试器只会对当前线程进行分析,所以一定要将线程环境切换到最可能引起问题的那个线程中去,才有帮助。这个参数非常有用,当真的遇到死锁时,它可以救命(另一个分析死锁的有效命令是!locks)。

Windgb 其他常用命令

  • !gle

  此命令是Get Last Error的缩写。它调用Win32接口函数GetLastError()取得线程的错误值,并打印分析结果。如果带有-all选项,则针对当前进程的所有线程执行GetLastError()操作;否则仅针对当前线程。

  • gh/gn

  这两个命令是g命令的扩展。

  1. gh:是go with Exception handled的缩写,意思是:把异常标识为已处理并继续执行程序;gh的作用在于,当遇到某个可以忽略的非致命异常时,将它先跳过,继续执行程序。
  2. gn:是go with Exception not handled的缩写,对异常不进行任何处理,而继续执行程序。这时候,程序自己的异常处理模块将有机会处理异

 

 

 !name2ee

显示指定模块中指定类型或方法的MethodTable结构和EEClass结构。

指定模块必须被装入进程中。

Windgb 其他常用命令

!dumpmt –md address 查看指定地址的方法表和一个类的方法集

Windgb 其他常用命令

!dumpmd address  显示指定地址的MethodDesc结构信息

显示某地址的对象的信息, 包括fields, EEClass, Method Table和object size

Windgb 其他常用命令

!gcroot address 查看所有对指定地址的对象的引用

 

!dumpil Address 查看指定地址的IL

0:035> !dumpil 000007fe9e8af4a0 
ilAddr = 0000000011b5a3e8
IL_0000: call System.Threading.Tasks.Task::get_Factory
IL_0005: ldsfld <>c::<>9__2_0
IL_000a: dup
IL_000b: brtrue.s IL_0024
IL_000d: pop
IL_000e: ldsfld <>c::<>9
IL_0013: ldftn <>c::<StartLogTask>b__2_0
IL_0019: newobj System.Action::.ctor
IL_001e: dup
IL_001f: stsfld <>c::<>9__2_0
IL_0024: callvirt System.Threading.Tasks.TaskFactory::StartNew
IL_0029: pop
IL_002a: ret

 

!savemodule moduleaddress path  保存具体的dll 到 某个路径

Windgb 其他常用命令

 

!heap 显示堆信息

  • !heap -a 显示某个进程下的堆信息(明细 

Windgb 其他常用命令


!EEHeap [-gc] [-loader]  

显示被公共语言运行时内部数据结构使用的进程内存的有关信息。

-gc 和 -loader 选项限制该命令的输出内容为垃圾收集器或者装载器的数据结构。

对于垃圾收集器,列出在托管堆里每一个节的范围信息。如果某指针是在EEHeap -gc给出的某个节范围内,那么该指针是一个对象指针。

 

Windgb 其他常用命令

 

!DumpHeap 将遍历 GC 堆对对象进行分析。通过指定不同的选项,可以查看特定的类型、数组和锁。

                  如果不加任何选项,该命令的输出首先为堆中对象的列表,然后是包含已发现类型的列表、大小和数量的报表。

其中 “Free” 对象代表的是垃圾回收器可以使用的区域。如果此区域的大小超过30%则可能意味着出现了堆碎片。

这通常是由于某些对象被持有了较长时间,并且结合了大量高频率的内存分配。

!DumpHeap 会针对此情况提供一个关于堆碎片化的警告

-stat              限定输出为类型统计分析的汇总

-min <size>    忽略尺寸小于给定的 bytes 值的对象

-max <size>   忽略尺寸大于给定的 bytes 值的对象

!dumpheap -min 850000 -stat   查找具体占用内存大的对象 -stat (是否统计输出)

Windgb 其他常用命令

 

Windgb 其他常用命令

有两个地址  查找该地址的引用   !gcroot 000000052f342dc8

!do address 显示某地址的对象的信息, 包括fields, EEClass, Method Table和object size
 
查找具体的位置 保存Model 到具体的地方 反编译查看原因