命令 | 描述 |
.loadby |
.loadby sos clr |
.load |
.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll |
命令 | 描述 |
!DumpObj (do) |
!DumpObj 显示指定地址的对象的信息。 !DumpObj -nofields 在显示结果中不显示字段信息,这对类似 String 类型等非常有用 |
!DumpArray (da) |
!DumpArray 检查数组对象元素 !DumpArray -start 可选项,只支持一维数组,从指定索引处开始显示数组元素 !DumpArray -length 可选项,只支持一维数组,指定显示元素的数量 !DumpArray -details 可选项,通过使用 !DumpObj 和 !DumpVC 来打印更多详细信息 !DumpArray -nofields 可选项,仅在 -details 选项使用时有效,不显示对象的字段信息 |
!DumpStackObjects (dso) |
!DumpStackObjects 显示当前调用栈上的所有托管对象的信息,可配合 k 或 CLRStack 命令使用 !DumpStackObjects -verify 将对非静态类中的所有字段进行检查 |
!DumpHeap |
!DumpHeap 将遍历 GC 堆对对象进行分析。通过指定不同的选项,可以查看特定的类型、数组和锁。 如果不加任何选项,该命令的输出首先为堆中对象的列表,然后是包含已发现类型的列表、大小和数量的报表。 其中 “Free” 对象代表的是垃圾回收器可以使用的区域。如果此区域的大小超过30%则可能意味着出现了堆碎片。 这通常是由于某些对象被持有了较长时间,并且结合了大量高频率的内存分配。 !DumpHeap 会针对此情况提供一个关于堆碎片化的警告。 -stat 限定输出为类型统计分析的汇总 -strings 限定输出为字符串类型的统计分析汇总 -short 限定输出仅为对象的地址,这将为串行化命令调试带来便利 -min <size> 忽略尺寸小于给定的 bytes 值的对象 -max <size> 忽略尺寸大于给定的 bytes 值的对象 -live 仅输出仍然存活的对象 -dead 仅输出已死亡的对象 (这些对象将在下一个 Full GC 中被回收) -thinlock ThinLocks 的报告 (参考 !SyncBlk) -startAtLowerBound 强制堆指向可使用的地址的低地址边界 -mt <MethodTable address> 仅列出包含 MethodTable 的对象 -type <partial type name> 仅列出对象类型字符串中包含给定子字符串的对象 start 从给定地址处开始列出对象 end 从给定地址处停止检索 start/end 的参数可以通过 !EEHeap -gc 命令来获取。例如,下面的图中显示列出大对象堆中的对象。 |
!DumpVC |
!DumpVC <MethodTable address> <Address> 检查值类型对象的字段,在 C# 中指的是 struct,存活于栈中或者被装箱为 Object 后存放在 GC 堆中。 需要为 SOS 提供值对象的方法表地址,因为值对象与一级对象不同,一级对象的第一个字段即为方法表。 |
!GCRoot |
!GCRoot [-nostacks] <Object address> 查询一个对象的所有引用根。 对象的引用根可能存在于如下位置:
在查询引用根时,首先在栈上查询,然后是句柄表,最后是对象终结器中的队列中的可达对象。 注:!GCRoot 不会栈上的对象根进行有效性校验。可以使用 !CLRStack 或 !U 来检查对象是否仍在被使用。 -nostacks 限定仅在句柄表和终结器队列中查找。 |
!ObjSize |
!ObjSize [<Object address>] 如果不加参数,!ObjSize 将列出托管线程中所有对象的尺寸。 同时,也会列出进程中的所有 GC 句柄,和句柄指向对象的大小。 在计算对象的尺寸时,!ObjSize 将计算对象及其所有子对象的大小。 |
!FinalizeQueue |
!FinalizeQueue [-detail] | [-allReady] [-short] !FinalizeQueue 列出所有注册为终结化的对象。 GC 堆是按照代来划分,此处同样列出每代中将被终结的对象的数量。 上图中显示了只有 0 代堆中包含了注册终结对象。"(0015bc90->0015bca0)" 提示了对象指针的内存查询区域。 -allReady 指定此选项后,将列出所有准备终结化的对象,无论其是否被标注为在当前轮 GC 还是下一轮 GC。 那些已经不在 "Ready for finalization" 列表中的对象则已经失去了引用根。 这个选项可能会有些开销,因为其会验证是否终结化队列中的对象是否仍然存在引用根。 -short 限定输出仅为对象的地址。 如果与 -allReady 选项同时使用,则将列出所有存在终结器中并且不再是引用根的对象。 如果单独使用,则将列出 "Ready for finalization" 队列中的所有对象。 -detail 显示额外的信息,例如需要被终结器清理的缓存的数据结构等。 |
!PrintException (pe) |
!PrintException [-nested] [-lines] [<Exception object address>] !PrintException 将对任意 System.Exception 的衍生对象的字段进行格式化。 例如,将对 _stackTrace 字段进行格式化。 如果不加任何参数,!PrintException 将查找当前线程上最有一个出现的异常。 这与使用 !Threads 中显示的异常是相同的。 -nested 显示嵌套的异常信息。 -lines 显示异常的可用的源信息。 |
!TraverseHeap |
!TraverseHeap [-xml] [-verify] <filename> !TraverseHeap 将以一种 CLR Profiler 可理解的格式将 GC 堆信息输出到文件。 可以在如下链接下载 CLR Profiler: CLR Profiler 将以图形化的方式来帮助分析应用程序 GC 堆的状态。 -verify 将进行更多合法性检测,可在有任何疑似堆腐化时使用。 -xml 输出格式指定为 XML 格式。 |