WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手
SOS 調(diào)試命令手冊(cè)
| 擴(kuò)展加載命令? | |
| 命令 | 描述 |
| .loadby | .loadby sos clr? |
| .load | .load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll |
?
| 對(duì)象審查命令? | |
| 命令 | 描述 |
| !DumpObj (do) | !DumpObj ? ? ? ? ? ? ? 顯示指定地址的對(duì)象的信息。 !DumpObj -nofields 在顯示結(jié)果中不顯示字段信息,這對(duì)類似 String 類型等非常有用 |
| !DumpArray (da) | !DumpArray ? ? ? ? ? ? ? ? 檢查數(shù)組對(duì)象元素 !DumpArray -start ? ? ? ?可選項(xiàng),只支持一維數(shù)組,從指定索引處開(kāi)始顯示數(shù)組元素 !DumpArray -length ? ? ?可選項(xiàng),只支持一維數(shù)組,指定顯示元素的數(shù)量 !DumpArray -details ? ? ?可選項(xiàng),通過(guò)使用 !DumpObj 和 !DumpVC 來(lái)打印更多詳細(xì)信息 !DumpArray -nofields ? ?可選項(xiàng),僅在 -details 選項(xiàng)使用時(shí)有效,不顯示對(duì)象的字段信息 |
| !DumpStackObjects (dso) | !DumpStackObjects ? ? ? ? ? ?顯示當(dāng)前調(diào)用棧上的所有托管對(duì)象的信息,可配合 k 或 CLRStack 命令使用 !DumpStackObjects -verify ?將對(duì)非靜態(tài)類中的所有字段進(jìn)行檢查 |
| !DumpHeap | !DumpHeap 將遍歷 GC 堆對(duì)對(duì)象進(jìn)行分析。通過(guò)指定不同的選項(xiàng),可以查看特定的類型、數(shù)組和鎖。 ? ? ? ? ? ? ? ? ? 如果不加任何選項(xiàng),該命令的輸出首先為堆中對(duì)象的列表,然后是包含已發(fā)現(xiàn)類型的列表、大小和數(shù)量的報(bào)表。 其中 “Free” 對(duì)象代表的是垃圾回收器可以使用的區(qū)域。如果此區(qū)域的大小超過(guò)30%則可能意味著出現(xiàn)了堆碎片。 這通常是由于某些對(duì)象被持有了較長(zhǎng)時(shí)間,并且結(jié)合了大量高頻率的內(nèi)存分配。 !DumpHeap 會(huì)針對(duì)此情況提供一個(gè)關(guān)于堆碎片化的警告。 -stat ? ? ? ? ? ? ?限定輸出為類型統(tǒng)計(jì)分析的匯總 -strings ? ? ? ? ?限定輸出為字符串類型的統(tǒng)計(jì)分析匯總 -short ? ? ? ? ? ?限定輸出僅為對(duì)象的地址,這將為串行化命令調(diào)試帶來(lái)便利 -min <size> ? ?忽略尺寸小于給定的 bytes 值的對(duì)象 -max <size> ? 忽略尺寸大于給定的 bytes 值的對(duì)象 -live ? ? ? ? ? ? ? 僅輸出仍然存活的對(duì)象 -dead ? ? ? ? ? ? 僅輸出已死亡的對(duì)象 (這些對(duì)象將在下一個(gè) Full GC 中被回收) -thinlock ? ? ? ? ThinLocks 的報(bào)告 (參考 !SyncBlk) -startAtLowerBound ? ? ? ? ? ? ?強(qiáng)制堆指向可使用的地址的低地址邊界 -mt <MethodTable address> ?僅列出包含 MethodTable 的對(duì)象 -type <partial type name> ? ? 僅列出對(duì)象類型字符串中包含給定子字符串的對(duì)象 start ? ? ? ? ? ? ? 從給定地址處開(kāi)始列出對(duì)象 end ? ? ? ? ? ? ? ? 從給定地址處停止檢索 start/end 的參數(shù)可以通過(guò) !EEHeap -gc 命令來(lái)獲取。例如,下面的圖中顯示列出大對(duì)象堆中的對(duì)象。 |
| !DumpVC | !DumpVC <MethodTable address> <Address> ? 檢查值類型對(duì)象的字段,在 C# 中指的是 struct,存活于棧中或者被裝箱為 Object 后存放在 GC 堆中。 需要為 SOS 提供值對(duì)象的方法表地址,因?yàn)橹祵?duì)象與一級(jí)對(duì)象不同,一級(jí)對(duì)象的第一個(gè)字段即為方法表。 |
| !GCRoot | !GCRoot [-nostacks] <Object address> ?查詢一個(gè)對(duì)象的所有引用根。 對(duì)象的引用根可能存在于如下位置: 在查詢引用根時(shí),首先在棧上查詢,然后是句柄表,最后是對(duì)象終結(jié)器中的隊(duì)列中的可達(dá)對(duì)象。 注:!GCRoot 不會(huì)棧上的對(duì)象根進(jìn)行有效性校驗(yàn)。可以使用 !CLRStack 或 !U 來(lái)檢查對(duì)象是否仍在被使用。 -nostacks ? 限定僅在句柄表和終結(jié)器隊(duì)列中查找。 |
| !ObjSize | !ObjSize [<Object address>] ? 如果不加參數(shù),!ObjSize 將列出托管線程中所有對(duì)象的尺寸。 同時(shí),也會(huì)列出進(jìn)程中的所有?GC 句柄,和句柄指向?qū)ο蟮拇笮 ?/p> 在計(jì)算對(duì)象的尺寸時(shí),!ObjSize 將計(jì)算對(duì)象及其所有子對(duì)象的大小。 |
| !FinalizeQueue | !FinalizeQueue [-detail] | [-allReady] [-short] !FinalizeQueue ? 列出所有注冊(cè)為終結(jié)化的對(duì)象。 GC 堆是按照代來(lái)劃分,此處同樣列出每代中將被終結(jié)的對(duì)象的數(shù)量。 上圖中顯示了只有 0 代堆中包含了注冊(cè)終結(jié)對(duì)象。"(0015bc90->0015bca0)" 提示了對(duì)象指針的內(nèi)存查詢區(qū)域。 -allReady ? 指定此選項(xiàng)后,將列出所有準(zhǔn)備終結(jié)化的對(duì)象,無(wú)論其是否被標(biāo)注為在當(dāng)前輪 GC 還是下一輪 GC。 ? ? ? ? ? ? ? ? 那些已經(jīng)不在?"Ready for finalization" 列表中的對(duì)象則已經(jīng)失去了引用根。 ? ? ? ? ? ? ? ? 這個(gè)選項(xiàng)可能會(huì)有些開(kāi)銷,因?yàn)槠鋾?huì)驗(yàn)證是否終結(jié)化隊(duì)列中的對(duì)象是否仍然存在引用根。 -short ? ? ? 限定輸出僅為對(duì)象的地址。 ? ? ? ? ? ? ? ? 如果與 -allReady 選項(xiàng)同時(shí)使用,則將列出所有存在終結(jié)器中并且不再是引用根的對(duì)象。 ? ? ? ? ? ? ? ? 如果單獨(dú)使用,則將列出?"Ready for finalization" 隊(duì)列中的所有對(duì)象。 -detail ? ? ? 顯示額外的信息,例如需要被終結(jié)器清理的緩存的數(shù)據(jù)結(jié)構(gòu)等。 |
| !PrintException (pe) | !PrintException [-nested] [-lines] [<Exception object address>] !PrintException 將對(duì)任意 System.Exception 的衍生對(duì)象的字段進(jìn)行格式化。 ? ? ? ? ? ? ? ? ? ? ? ?例如,將對(duì) _stackTrace 字段進(jìn)行格式化。 ? ? ? ? ? ? ? ? ? ? ? ?如果不加任何參數(shù),!PrintException?將查找當(dāng)前線程上最有一個(gè)出現(xiàn)的異常。 ? ? ? ? ? ? ? ? ? ? ? ?這與使用 !Threads 中顯示的異常是相同的。 -nested 顯示嵌套的異常信息。 -lines ? ?顯示異常的可用的源信息。 |
| !TraverseHeap | !TraverseHeap [-xml] [-verify] <filename> !TraverseHeap ?將以一種 CLR Profiler 可理解的格式將 GC 堆信息輸出到文件。 可以在如下鏈接下載 CLR Profiler: http://www.microsoft.com/downloads/details.aspx?FamilyId=86CE6052-D7F4-4AEB-9B7A-94635BEEBDDA&displaylang=en CLR Profiler 將以圖形化的方式來(lái)幫助分析應(yīng)用程序 GC 堆的狀態(tài)。 -verify ?將進(jìn)行更多合法性檢測(cè),可在有任何疑似堆腐化時(shí)使用。 -xml ? ? 輸出格式指定為 XML 格式。 |
| 數(shù)據(jù)結(jié)構(gòu)審查命令? | |
| 命令 | 描述 |
| !DumpDomain | !DumpDomain [<Domain address>] 在無(wú)參數(shù)時(shí),!DumpDomain 將列出進(jìn)程中所有的 AppDomain 。同時(shí)也會(huì)遍歷所有已加載的程序集。 在應(yīng)用程序的的 AppDomain 之外,還存在另外兩個(gè)特殊的應(yīng)用程序域:Shared Domain 和 System Domain。 所列出的任意程序集的指針均可用于 !DumpAssembly 命令。任何 AppDomain 指針均可被使用于 !DumpDomain 命令。 |
| !EEHeap | !EEHeap [-gc] [-loader] ?遍歷進(jìn)程內(nèi)存中的 CLR 數(shù)據(jù)結(jié)構(gòu)。 !EEHeap -gc !EEHeap -loader |
| !Name2EE | !Name2EE <module name> <type or method name> !Name2EE <module name>!<type or method name> !Name2EE 用于將給定的類名稱轉(zhuǎn)換為 MethodTable 或 EEClass 的地址。或?qū)⒎椒Q轉(zhuǎn)換為 MethodDesc。 |
| !SyncBlk | !SyncBlk [-all | <syncblk number>] SyncBlock 負(fù)責(zé)持有一些不是為每個(gè)對(duì)象都需創(chuàng)建的額外信息,例如 COM Interop 數(shù)據(jù)、HashCodes、鎖信息等。 例如,假設(shè)有如下代碼: lock (MyObject) {... }則將設(shè)置 MyObject 為當(dāng)前線程所擁有。一個(gè) SyncBlock 將會(huì)為 MyObject 創(chuàng)建,并且包含線程的宿主信息等。 如果另外一個(gè)線程試圖執(zhí)行同樣的代碼,該線程將不能進(jìn)入該 Block 中直到上一個(gè)線程退出。 這將使 !SyncBlk 在檢測(cè)托管線程死鎖時(shí)非常有用途。例如有如下代碼情形: Resource r1 = new Resource(); Resource r2 = new Resource();lock (r1) {lock (r2){...} }lock (r2) {lock (r1){...} }通過(guò)上面的描述可以了解到,線程 e04 持有著對(duì)象 00a7a194,而線程 ab8 持有著對(duì)象 00a7a1a4。 再結(jié)合調(diào)用棧信息可發(fā)現(xiàn)死鎖。 此處,可通過(guò)運(yùn)行 !U 或 !DumpHeap -ThinLock 獲取更多信息。 |
| !DumpMT | !DumpMT [-MD] <MethodTable address> ?顯示方法表。每個(gè)托管對(duì)象都在其起始位置包含一個(gè)方法表指針。 -MD 顯示對(duì)象中定義的方法列表。 |
| !DumpClass | !DumpClass <EEClass address> 顯示 EEClass 中定義的屬性和字段類型。 EEClass 是一種描述對(duì)象類型的數(shù)據(jù)結(jié)構(gòu)。 |
| !Token2EE | !Token2EE <module name> <token> ?將 Token 元數(shù)據(jù)轉(zhuǎn)換為 MethodTable 或 MethodDesc。 |
| !EEVersion | 顯示 CLR 版本。同時(shí)也顯示應(yīng)用程序代碼是運(yùn)行在?"Workstation" 或 "Server" 模式。 類似的功能可以通過(guò)命令:"lm v m clr" |
| !DumpModule | !DumpModule [-mt] <Module address> ?通過(guò)模塊地址獲取模塊信息。 -mt 顯示模塊內(nèi)定義的類型信息。 |
| !ThreadPool | 顯示線程池的基本信息,包括隊(duì)列中請(qǐng)求的數(shù)量、完成端口線程的數(shù)量和計(jì)時(shí)器的數(shù)量。 |
| !DumpAssembly | !DumpAssembly <Assembly address> 顯示指定地址程序集的信息。 |
| !DumpSigElem | !DumpSigElem <sigaddr> <moduleaddr> ?顯示簽名對(duì)象中的一個(gè)指定元素信息。 |
| !DumpRuntimeTypes | !DumpRuntimeTypes ?從 GC 堆中尋找 System.RuntimeType 類型的對(duì)象,并且打印類型名稱和方法表。 |
| !DumpSig | !DumpSig <sigaddr> <moduleaddr> ?顯示給定地址的方法或字段的簽名信息。 |
| !RCWCleanupList | !RCWCleanupList [address] ?顯示在下一次清理周期內(nèi)回收的 COM 對(duì)象信息。 RuntimeCallableWrapper 是 CLR 內(nèi)部的數(shù)據(jù)結(jié)構(gòu),用于宿主 COM 對(duì)象。 通過(guò) System.__ComObject 類向托管代碼暴露。 當(dāng)相應(yīng)的對(duì)象被 GC 回收之后,相關(guān)的 COM 對(duì)象引用也不在需要,所以相應(yīng)的 RCW 也需要被清理。 |
| !DumpIL | !DumpIL <Managed DynamicMethod object> |? 打印托管方法的 IL 代碼。在調(diào)試 DynamicMethod 時(shí)非常有效,但同樣適合 non-DynamicMethod。 可以在下列 4 種條件下使用: |
| !DumpRCW | !DumpRCW <RCW address> ? ? ? ? ? ? ? ? 顯示 RuntimeCallableWrapper 的信息。 |
| !DumpCCW | !DumpCCW <CCW address or COM IP> ?顯示 COMCallableWrapper 的信息。 |
| 代碼堆棧審查命令? | |
| 命令 | 描述 |
| !Threads | !Threads [-live] [-special] ?列出進(jìn)程中所有的托管線程。 -live ? ? ? ?可選項(xiàng)。僅顯示活躍的線程。 -special ? 可選項(xiàng)。顯示由 CLR 創(chuàng)建的特殊線程,這些線程有可能不是托管線程。 ? ? ? ? ? ? ? 例如 GC 線程、調(diào)試器線程、終結(jié)器線程、應(yīng)用程序域卸載線程、線程池計(jì)時(shí)器線程等。 ID 列涵義: |
| !ThreadState | !ThreadState value ? 顯示線程狀態(tài) 可能的線程狀態(tài)包括:
|
| !IP2MD | !IP2MD <Code address> ?根據(jù)給定的托管 JITTED 代碼,查找相關(guān)的?MethodDesc。 上面的例子中,我們通過(guò) Mainy.Main 的返回地址來(lái)尋找相關(guān)的方法信息。 |
| !U | !U [-gcinfo] [-ehinfo] [-n] <MethodDesc address> | <Code address> 根據(jù)給定方法的 MethodDesc 指針,輸出反匯編代碼。 -gcinfo ?同時(shí)獲得方法的?GCInfo 信息。相關(guān)信息可通過(guò) !GCInfo 獲得。 -ehinfo ?同時(shí)獲得方法的異常信息。相關(guān)信息可通過(guò) !EHInfo 獲得。 -n ? ? ? ? 不顯示行號(hào)和符號(hào)等信息。 |
| !DumpStack | !DumpStack [-EE] [-n] [top stack [bottom stack]] ? 提供詳細(xì)甚至過(guò)于冗余混淆的調(diào)用棧信息。 -EE ?僅顯示托管函數(shù)。 -n ? ?不顯示行號(hào)或符號(hào)信息。 |
| !EEStack | !EEStack [-short] [-EE] ?這個(gè)命令用于在進(jìn)程內(nèi)的所有線程上運(yùn)行 !DumpStack。 -EE ? ? ?該選項(xiàng)將直接被傳遞給 !DumpStack 命令。 -short ?嘗試僅顯示可能感興趣的線程,包括: |
| !CLRStack | !CLRStack [-a] [-l] [-p] [-n] !CLRStack [-a] [-l] [-p] [-i] [variable name] [frame] !CLRStack 試圖僅為托管代碼提供真實(shí)的調(diào)用棧信息。 -p ? ?顯示托管函數(shù)的參數(shù)信息。 -l ? ? 顯示幀內(nèi)局部變量的信息。 -a ? ?= -p + -l 的組合。 -n ? ?不顯示行信息和符號(hào)信息。 |
| !GCInfo | !GCInfo (<MethodDesc address> | <Code address>) 用于診斷 JIT 編譯器是否存在Bug。 |
| !EHInfo | !EHInfo (<MethodDesc address> | <Code address>) ?用于顯示 JITTED 方法的異常處理部分。 |
| !BPMD | !BPMD [-nofuturemodule] <module name> <method name> [<il offset>] !BPMD <source file name>:<line number> !BPMD -md <MethodDesc> !BPMD -list !BPMD -clear <pending breakpoint number> !BPMD -clearall !BPMD 用于提供托管代碼的斷點(diǎn)支持。 |
| !COMState | 顯示進(jìn)程的?COM Apartment Model。 |
| 垃圾回收歷史審查命令? | |
| 命令 | 描述 |
| !HistInit | !HistInit?在運(yùn)行任何 Hist 族命令之前,需要先根據(jù)被調(diào)試程序的壓縮日志中初始化 SOS 結(jié)構(gòu)。 |
| !HistRoot | !HistRoot <root> ?顯示 promotion 和 relocation 信息。 |
| !HistObj | !HistObj <obj_address> ?從日志中檢查 GC relocation 鏈。 |
| !HistObjFind | !HistObjFind <obj_address> ?從日志中檢索與對(duì)象的 relocation 相關(guān)的所有信息。 |
| !HistClear | !HistClear ?釋放用于 Hist 族命令的所有資源。通常無(wú)需顯式的調(diào)用此命令,因?yàn)槊看?HistInit 會(huì)首先清理資源。 |
| 診斷工具命令? | |
| 命令 | 描述 |
| !VerifyHeap | !VerifyHeap 是一個(gè)用于檢測(cè) GC 堆中是否有腐化跡象的診斷工具。 其以如下的模式逐個(gè)的走查對(duì)象: |
| !VerifyObj | !VerifyObj <object address> 是一個(gè)用于檢查被傳遞的對(duì)象參數(shù)是否存在腐化的跡象的診斷工具。 |
| !FindRoots | !FindRoots -gen <N> | -gen any | <object address> 用于查找對(duì)象的引用根的診斷工具。 |
| !HeapStat | !HeapStat [-inclUnrooted | -iu] ?顯示GC堆中每個(gè)代的大小和總和,同時(shí)顯示空閑空間的大小。 -inclUnrooted ?報(bào)告中包含那些在 GC 堆中已標(biāo)識(shí)為不再引用的托管對(duì)象。 |
| !GCWhere | !GCWhere <object address> ?顯示指定對(duì)象在 GC 堆中的位置。 |
| !ListNearObj (lno) | !ListNearObj <object address> ?用于顯示對(duì)象前后的對(duì)象的診斷工具。 |
| !GCHandles | !GCHandles [-type handletype] [-stat] [-perdomain] ?提供對(duì)進(jìn)程中 GCHandles 的統(tǒng)計(jì)分析。 -stat ? ? ? ? ? ?僅顯示統(tǒng)計(jì)信息,而不列出句柄和其指向的信息。 -perdomain ? 根據(jù) AppDomain 來(lái)顯示統(tǒng)計(jì)信息。 -type ? ? ? ? ? ?句柄類型的過(guò)濾。 可用的句柄類型包括:
|
| !GCHandleLeaks | !GCHandleLeaks ?幫助檢測(cè) GCHandle 泄漏的工具。 |
| !FindAppDomain | !FindAppDomain <Object address> ?嘗試根據(jù)對(duì)象查找出 AppDomain。 |
| !SaveModule | !SaveModule <Base address> <Filename> ?將內(nèi)存鏡像保存至文件。 |
| !ProcInfo | !ProcInfo [-env] [-time] [-mem] ?列出進(jìn)程中的環(huán)境變量,內(nèi)核 CPU 時(shí)間,內(nèi)存使用率等。 |
| !StopOnException (soe) | !StopOnException [-derived]? !StopOnException 當(dāng)需要調(diào)試器在遇到特定的托管異常時(shí)停止。 例如,當(dāng)遇到?System.OutOfMemoryException 時(shí)停止,而遇到其他異常時(shí)繼續(xù)運(yùn)行。 |
| !DumpLog | !DumpLog [-addr <addressOfStressLog>] [<Filename>] ?允許將 CLR in-memory stress log 日志寫(xiě)入文件。 通過(guò)下面注冊(cè)表內(nèi)的信息更改 Stress Log 設(shè)置: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework: (DWORD) StressLog = 1 (DWORD) LogFacility = 0xffffffbf? (DWORD) StressLogSize = 65536 (DWORD) LogLevel = 6 LogFacility 定義:
|
| !VMMap | !VMMap ?遍歷虛擬地址空間,列出 Region Protection 類型。 |
| !VMStat | !VMStat ?提供虛擬地址空間的綜合報(bào)告。 |
| !MinidumpMode | !MinidumpMode <0 or 1> 通過(guò) ".dump /m" 或 ".dump" 來(lái)獲得 CLR 數(shù)據(jù)的子集,僅適合使用 SOS 的命令的子集,一些 SOS 命令可能失敗。 默認(rèn)值為 0。 |
| !AnalyzeOOM (ao) | !AnalyzeOOM 顯示最后一個(gè) OOM 的信息。 |
轉(zhuǎn)載于:https://www.cnblogs.com/wodemingtian/p/10449798.html
總結(jié)
以上是生活随笔為你收集整理的WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: intellij idea14.1 卡顿
- 下一篇: nodejs+express+mongo