SOS包含幾十個命令,要熟練使用SOS,首先要了解SOS有哪些命令。下面給出SOS命令列表。面試
命令 | 描述 |
---|---|
BPMD [<module name> <method name>] [-md <MethodDesc>]數組 |
創建一個斷點在指定模塊的指定方法上。緩存 若是指定模塊和方法還沒有被載入,該命令等到該模塊被載入而且被即時(just-in-time)編譯的通知後再創建斷點。安全 |
CLRStack [-a] [-l] [-p]服務器 |
只提供託管代碼的棧跟蹤。數據結構 -p 選項顯示託管函數的參數。併發 -l 選項顯示在一個框架裏局部變量的信息。SOS調試擴展沒法檢索局部變量的名字,因此局部變量的輸出格式爲<local address> = <value>。oracle -a (all) 選項是-l和-p組合的快捷方式。app 在x64和基於IA-64的平臺上,SOS調試擴展不顯示過渡框架(Transition Frames)。框架 |
COMState |
列出每一個線程COM單元模型和可用的上下文指針。 |
DumpArray [-start <startIndex>] [-length <length>] [-details] [-nofields] <array object address> -或者- DA [-start <startIndex>] [-length<length>] [-detail] [-nofields] <array object address> |
檢查一個數組對象的元素。 -start 選項指定顯示元素的起始索引號。 -length 選項指定要顯示的元素數目。 -detail 選項按照DumpObj和DumpVC格式顯示元素的細節。 -nofields 選項使數組顯示不包括字段。僅當指定 -detail 選項時該選項纔可用。 |
DumpAssembly <Assembly address> |
顯示一個彙編集的有關信息。 若是存在多個模塊,DumpAssembly命令將它們所有列出。 你能夠用DumpDomain命令獲得彙編集地址。 |
DumpClass <EEClass address> |
顯示與一個類型相關的EEClass結構這些信息。 DumpClass命令顯示靜態字段值而不顯示非靜態字段值。 使用DumpMT、DumpObj、Name2EE、或Token2EE命令來獲取一個EEClass結構地址。 |
DumpDomain [<Domain address>] |
枚舉在指定AppDomain對象地址裏面裝載的每個Assembly對象。當不帶參數調用DumpDomain命令時,它列出一個進程中全部的AppDomain對象。 |
DumpHeap [-stat] [-min <size>][-max <size>] [-thinlock] [-mt<MethodTable address>] [-type<partial type name>][start [end]] |
顯示關於垃圾收集堆的信息和有關對象的收集統計。 DumpHeap命令若是在垃圾收集器堆中檢測到過多的碎片,它顯示一個警告。 -stat 選項限制輸出內容只有統計的類型摘要。 -min 選項忽略那些尺寸小於size參數的對象,以字節爲單位。 -max 選項忽略那些尺寸大於size參數的對象,以字節爲單位。 -thinlock 選項報告ThinLocks。更多信息請看SyncBlk命令。 -mt 選項只列出符合所指定MethodTable結構的那些對象。 -type 選項只列出類型名字子串匹配指定字符串的那些對象。 參數 start 指定開始列出的地址。 參數 end 指定中止列出的地址。 |
DumpIL [<DynamicMethod address>] [<DynamicMethodDesc address>] [<MethodDesc address>] |
顯示與一個託管方法相關的中間語言(IL)。 注意,動態IL是發射來的(emitted),不一樣於從一個彙編集裝載的IL。動態IL引用一個託管對象數組中的對象,而不是經過元數據標記引用對象。 |
DumpLog [<Filename>] |
把一個內存裏的重要日誌的內容寫入指定文件。若是你沒有指定文件名,該命令在當前目錄中建立一個名爲Stresslog.txt的文件。 公共語言運行時提供一個內存裏的重要日誌,幫助你診斷重要失敗。日誌使你能夠不使用鎖或I/O就能診斷失敗。若要啓用重要日誌,須要在HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework下面設置如下注冊表項: (DWORD) StressLog = 1 (DWORD) LogFacility = 0xffffffff (DWORD) StressLogSize = 65536 |
DumpMD <MethodDesc address> |
顯示的信息是在指定地址上的一個MethodDesc結構。 你能夠用IP2MD命令獲得一個託管函數的MethodDesc結構地址。 |
DumpMT [-MD] <MethodTable address> |
顯示在指定地址上的一個方法表的有關信息。指定 -MD 選項顯示列出該對象定義的全部方法。 每一個託管對象包含有一個方法表指針。 |
DumpMethodSig <sigaddr> <moduleaddr> |
顯示在指定地址上的一個MethodSig結構的有關信息。 |
DumpModule [-mt] <Module address> |
顯示在指定地址上的一個模塊的有關信息。-mt 選項顯示在該模塊中所定義的類型和被該模塊引用的類型。 你能夠用DumpDomain或DumpAssembly命令檢索一個模塊的地址。 |
DumpObj <object address> -或者- DO <object address> |
顯示在指定地址上的一個對象的有關信息。DumpObj命令顯示字段、EEClass結構信息、方法表和該對象的尺寸。 你能夠用DumpStackObjects命令檢索一個對象的地址。 注意,由於類型CLASS的字段也是對象,因此你能夠對它們執行DumpObj命令。 |
DumpRuntimeTypes |
顯示在垃圾收集器堆中的運行時類型對象,並列出與它們相關的類型名字和方法表。 |
DumpStack [-EE] [top stack [bottom stack]] |
顯示一個棧跟蹤(回溯)。 -EE 選項使DumpStack命令只顯示託管函數。在x86平臺上使用top和bottom參數限制所顯示的棧框架。 在x86平臺上,DumpStack命令建立一個冗長的棧跟蹤。 在x64和基於IA-64的平臺上,DumpStack命令模仿調試器的 K 命令。在x64和基於IA-64的平臺上top和bottom參數被忽略。 |
DumpSig <sigaddr> <moduleaddr> |
顯示在指定地址上的一個Sig結構的有關信息。 |
DumpStackObjects [-verify] [top stack [bottom stack]] -或者- DSO [-verify] [top stack [bottom stack]] |
顯示在當前棧範圍內找到的全部託管對象。 -verify 選項驗證對象字段的每個非靜態CLASS字段。 帶有棧跟蹤命令使用DumpStackObject命令,好比 K 命令和CLRStack命令肯定局部變量和參數的值。 |
DumpVC <MethodTable address> <Address> |
顯示在指定地址上的一個值類的字段信息。 MethodTable參數使DumpVC命令可以正確地解釋字段。值類不以方法表做爲它們的第一個字段。 |
EEHeap [-gc] [-loader] |
顯示被公共語言運行時內部數據結構使用的進程內存的有關信息。 -gc 和 -loader 選項限制該命令的輸出內容爲垃圾收集器或者裝載器的數據結構。 對於垃圾收集器,列出在託管堆裏每個節的範圍信息。若是某指針是在EEHeap -gc給出的某個節範圍內,那麼該指針是一個對象指針。 |
EEStack [-short] [-EE] |
對進程中全部線程執行DumpStack命令。 -EE 選項被直接傳遞給DumpStack命令。-short 參數限制輸入內容爲如下線程種類:
|
EEVersion |
顯示公共語言運行時版本。 |
EHInfo [<MethodDesc address>] [<Code address>]
|
顯示所指定方法裏的異常處理塊。這個命令顯示子句塊(try塊)和處理者塊(catch塊)的代碼地址及偏移量。 |
FinalizeQueue [-detail] |
顯示爲終結(finalization)而登記的全部對象。 -detail 選項顯示關於等待清除的任何SyncBlocks的附加信息和等待清除的任何RuntimeCallableWrappers (RCWs) 的額外信息。兩個數據結構都是由終結器(finalizer)線程緩存和清除。 |
FindAppDomain <Object address> |
肯定在指定地址上的一個對象的應用程序域。 |
GCHandles [-perdomain] |
顯示在進程中垃圾收集器句柄的統計。 若是傳遞-perdomain 選項,則按照應用程序域順序排列統計。 使用GCHandles命令查找由垃圾收集器句柄泄漏引發的內存泄漏。例如,因爲一個強健的垃圾收集器句柄指向代碼的一個大數組成部分,而該句柄沒有被釋放就丟棄了,因此代碼實際上還保留着這個數組,這時就出現一個內存泄漏。 |
GCHandleLeaks |
在內存裏搜索進程中對那些強健並且有麻煩的垃圾收集器句柄的任何引用,而且顯示結果。若是找到某個句柄,GCHandleLeaks命令顯示該引用的地址。若是在內存裏沒有找到某個句柄,這個命令顯示一個通知。 |
GCInfo <MethodDesc address><Code address> |
顯示數據指示什麼時候寄存器或棧位置包含有託管對象。若是發生垃圾收集,收集器必須知道指向對象的引用的位置,如此它才能夠用新的對象指針值更新它們。 |
GCRoot [-nostacks] <Object address> |
顯示對在指定地址上的一個對象的引用(或根)信息。 GCRoot命令檢查整個託管堆和在棧以及其餘對象裏面句柄的句柄表。而後,在每一個棧和終結器隊列中搜索指向對象的指針。 這個命令不肯定一個棧根是有效的仍是已丟棄的。爲了肯定棧根是否還在使用中,須要用CLRStack和U命令反彙編局部變量或參數值所屬的框架。 -nostacks 選項限制只搜索垃圾收集器句柄和終結器隊列裏的對象(freachable objects)。 |
help [<command>] [<faq>] |
當沒有指定參數時顯示全部可用命令,或者當指定命令爲參數時顯示其詳細幫助信息。 faq 參數顯示常問問題的答案。 |
IP2MD <Code address> |
顯示在已經即時編譯(JIT)的代碼裏指定地址上的MethodDesc結構。 |
MinidumpMode [0] [1]
|
防止在使用一個小轉儲(minidump)時執行非安全命令。 傳遞 0 以禁用這個功能,或傳遞 1 以啓用這個功能。默認地,MinidumpMode把值設置爲 0 。 用 .dump /m 命令或者 .dump 命令建立的小轉儲已經限制爲特定的CLR數據,而且讓你只能夠正確地運行SOS命令的一個子集。有些命令可能因不可預見的錯誤而失敗,由於所必需的內存區域沒有被映射或者只有部分被映射。這個選項讓你避免對小轉儲執行非安全命令。 |
Name2EE <module name> <type or method name> -或者- Name2EE <module name>!<type or method name> |
顯示指定模塊中指定類型或方法的MethodTable結構和EEClass結構。 指定模塊必須被裝入進程中。 可使用MSIL反彙編器 (Ildasm.exe) 瀏覽模塊,以取得適當的類型名字。你也能夠傳遞 * 做爲模塊名字參數以搜索全部裝入的託管模塊。模塊名字參數也能夠是調試器給一個模塊的名字,好比mscorlib或image00400000。 這個命令支持Windows調試器句法<module>!<type>。該類型必須被徹底限定。 |
ObjSize [<Object address>] |
顯示指定對象的尺寸。若不帶參數,則ObjSize命令顯示在託管線程中找到的所有對象的尺寸,顯示進程中所有的垃圾收集器句柄,並求出指向那些句柄的全部對象的尺寸總和。ObjSize命令把父對象所有子對象的尺寸也計算在內。 |
PrintException [-nested] [<Exception object address>] -或者- PE [-nested] [<Exception object address>] |
編排格式並顯示在指定地址上的任何Exception類派生對象的字段。若是你沒有指定一個地址,PrintException命令顯示當前線程上最近拋出的異常。 -nested 選項詳細顯示嵌套的異常對象。 你可使用這個命令編排格式並查看_stackTrace字段,這是一個二元數組。 |
ProcInfo [-env] [-time] [-mem] |
顯示針對該進程的環境變量、內核CPU時間和內存使用統計。 |
RCWCleanupList<RCWCleanupList address> |
顯示在指定地址上的正等待清除的運行時可調用的包裹器列表。 |
SaveModule <Base address> <Filename> |
把裝入在指定地址上的一個內存映像寫入指定文件。 |
StopOnException [-derived] [-create | -create2] <Exception> <Pseudo-register number> |
使調試器當指定異常被拋出時中止,而當其餘異常被拋出時則繼續運行。 -derived 選項捕獲指定異常及其衍生的每一個異常。 |
SyncBlk [-all | <syncblk number>] |
顯示指定的SyncBlock結構或者全部的SyncBlock結構。若是你沒有傳遞任何參數,SyncBlk命令顯示一個線程全部對象相應的SyncBlock結構。 一個SyncBlock結構是一個附加信息的容器,沒必要爲每一個對象建立它。它可以容納COM互用數據、散列碼、和用於線程-安全操做的鎖定信息。 |
ThreadPool |
顯示託管線程池的有關信息,包括在隊列中工做請求的數目、徹底端口線程的數目、和計時器數目。 |
Token2EE <module name> <token> |
把指定模塊中指定的元數據標記轉換成一個MethodTable結構或者MethodDesc結構。 你也能夠把 * 做爲模塊名字參數,以使在每一個被載入的託管模塊中找出該標記的映射目標。模塊名字參數也能夠是調試器給一個模塊的名字,好比mscorlib 或 image00400000 。 |
Threads [-live] [-special] |
顯示進程中全部的託管線程。 Threads命令顯示 調試器簡寫ID號、公共語言運行時線程ID號、和正在操做中的系統線程ID號。此外,Threads命令顯示 一個Domain欄指示線程運行所處在的應用程序域、一個APT欄顯示COM單元的模式、和一個Exception欄顯示線程最近拋出的異常。 -live 選項顯示與某個活線程有關聯的那些線程。 -special 選項顯示CLR建立的全部特別線程。特別線程包括(併發GC和服務器GC中的)垃圾收集(GC)線程、調試器助手線程、Finalizer線程、AppDomain卸載線程、和線程池計時器線程。 |
TraverseHeap [-xml] <filename> |
遵守CLR簡檔器隱含的格式把堆信息寫入到指定文件。-xml選項使TraverseHeap命令把該文件格式化爲XML。 |
U [-gcinfo] [-ehinfo] <MethodDesc address> | <Code address> |
經過指定一個指向某個方法MethodDesc結構的指針或者指定其方法體裏面的一個代碼地址,顯示一個託管方法有註釋的反彙編。U命令顯示整個方法,從開始到完成,並在註釋裏把元數據標記轉換爲名字。 -gcinfo 選項使U命令顯示這個方法使用的GCInfo結構。 -ehinfo 選項顯示這個方法的異常信息。你也能夠用EHInfo命令來獲取該信息。 |
VerifyHeap |
檢查垃圾收集器堆的崩潰標誌,顯示發現的任何錯誤。 堆崩潰可以由不正確地構成的平臺援用(platform invoke)調用引發。 |
VMMap |
橫跨虛擬地址空間,顯示加諸每區域的保護類型。 |
VMStat |
按照加諸內存的保護類型(自由的free、保留的reserved、約束的committed、私有的private、映射的mapped、映像image)順序,提供虛擬地址空間的概覽。TOTAL欄顯示AVERAGE欄乘以BLK COUNT欄的結果。 |
SOS調試擴展讓你能夠查看在公共語言運行時裏面運行的代碼的有關信息。例如,你可使用SOS調試擴展顯示託管堆的有關信息,查找堆的錯誤,顯示運行時使用的內部數據類型,以及查看在運行時裏面運行的全部託管代碼的有關信息。
在調試託管代碼時,有兩個擴展DLL須要注意,它們分別是SOS和SOSEX。
在使用SOS以前,第一步就是要加載SOS。
一、元命令loadby加載SOS
元命令loadby嘗試找出由ModuleName指定的路徑(經過查看進程中的已加載模塊列表),而且使用這個路徑來加載指定的DLLNAME(調試器擴展的DLL)。
若是mscorwks模塊尚未被加載,那麼元命令loadby將提示如下錯誤信息:
0:000> .loadby sos.dll mscorwks
Unable to find module 'mscorwks'
在Windbg.exe中裝載SOS的命令是:
.loadby sos mscorwks
二、元命令load加載SOS
若是使用的.Net版本不一樣,那麼還能夠手動指定版本,如手動指定載入4.0版本命令:
.load C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/sos.dll
.load C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/sos.dll
若是是64位,那麼應該加載以下sos.dll
.load C:/Windows/Microsoft.NET/Framework64/v2.0.50727/sos.dll
.load C:/Windows/Microsoft.NET/Framework64/v2.0.50727/sos.dll
SOS.dll 隨 .NET Framework 安裝在 %windir%\microsoft.net\framework\<.NET 版本> 目錄下。
三、加載mscordacwks.dll
在調試.Net程序時,調試器能夠加載一個輔助DLL,稱爲mscordacwks.dll,這個DLL用於輸出託管代碼調試過程當中的各類信息。加載mscordacwks.dll的路徑取決於被加載到進程中的mscorwks.dll的路徑。在實時調試中一般不存在問題,由於咱們但願加載與已加載的mscorwks.dll相對應的mscordacwks.dll版本,但在過後調試中則可能出現版本不匹配的狀況。要想控制調試行爲,咱們可使用元命令,cordll,並控訴調試器加載mscordacwks.dll的確切位置。例如,若是要指定一個新路徑,那麼可使用如下命令:
.cordll -lp c:\x\y\z
這樣便能告訴調試器從文件夾c:\x\y\z下加載mscordacwks.dll。若是要卸載mscordacwks.dll可使用-u開關。
在調試器中有許多命令均可以用來轉儲內存的內容。內存轉儲一般用於查看內存中的對象。最經常使用的命令是d(表示內存)。命令d的最簡單形式只帶有一個參數,表示須要顯示的內存地址。命令d可以以很是簡潔的形式顯示須要查看的內存。
一、DumpObj 轉儲引用類型
DumpObj的縮寫爲dso。要判斷一個指針指向的是不是值類型,最佳方式就是使用DumpObj命令,但它只對引用類型有效。DumpObj命令的參數是一個指向引用類型的指針,能輸出這個引用類型的內容。若是給定的指針指向一個值類型,那麼DumpObj命令會給出如下錯誤提示:
0:000> !DumpObj 0x002bf0b4
<Note: this object has an invalid CLASS field>
Invalid object
DumpObj詳細介紹:
0:083> !do 00000002838d92c8
Name: System.String
MethodTable: 000007fef0667d90
EEClass: 000007fef026e560
Size: 411932(0x6491c) bytes
(C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
String: 粵A87xxx,粵ACxxx掛......
Fields:
MT Field Offset Type VT Attr Value Name
000007fef066f000 4000096 8 System.Int32 1 instance 205954 m_arrayLength
000007fef066f000 4000097 c System.Int32 1 instance 205953 m_stringLength
000007fef06697d8 4000098 10 System.Char 1 instance 7ca4 m_firstChar
000007fef0667d90 4000099 20 System.String 0 shared static Empty
>> Domain:Value 000000000112bef0:00000001ff350370 000000000372e6e0:00000001ff350370 <<
000007fef0669688 400009a 28 System.Char[] 0 shared static WhitespaceChars
>> Domain:Value 000000000112bef0:00000001ff350b60 000000000372e6e0:00000001ff3588e8 <<
說明:
選項 | 說明 |
MT | 這個域的方法列表 |
Field | 這個域的元數據。高順序位(4)表示它是一個域,而低順序位(1)是在元數據表中的偏移。 |
Offset | 這個域在引用類型內存佈局中的偏移。 |
Type | 這個類型的縮寫名字。 |
VT | 若是被設置爲1,那麼表示這是一個值類型,若是爲0,這表示是一個引用類型。 |
Attr | 對象的屬性。 |
Value | 域的值。 |
Name | 域的名字。 |
二、DumpVC 轉儲值類型
DumpVC的惟一做用就是顯示值類型,它可以轉儲引用類型裏面的值類型。
它惟一的形式以下:
!DumpVC <MethodTable address> <Address>
在DumpObj命令的輸出中能夠很容易地獲得"Method Table Address"和"Address"。Method Table Address就是do命令Fields下的MT列,Address就是Value列。
0:083> !DumpVC 907b50 67903084
Not a managed object
0:083> !DumpVC 000007fef066f000 191394
Name: System.Int32
MethodTable 000007fef066f000
EEClass: 000007fef0272088
Size: 24(0x18) bytes
(C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
Fields:
MT Field Offset Type VT Attr Value Name
000007fef066f000 4000411 0 System.Int32 1 instance m_value
三、!DumpStackObjects 當前線程對象分配過程
!DumpStackObjects 當前線程的對象分配過程。縮寫形式爲!dso。
0:083> !dso OS Thread Id: 0x6914 (83) RSP/REG Object Name 000000000b65c470 000000022f3cfe10 System.Web.HttpApplication+PipelineStepManager 000000000b65c8a8 00000002838d92c8 System.String 000000000b65ca10 000000014f620fe0 System.String 000000000b65ca18 00000002838d92c8 System.String 000000000b65ca20 000000014f621260 System.String 000000000b65ca38 000000022f3cfe10 System.Web.HttpApplication+PipelineStepManager 000000000b65ca98 000000022f3cfe10 System.Web.HttpApplication+PipelineStepManager 000000000b65caa0 000000022f3cfe10 System.Web.HttpApplication+PipelineStepManager 000000000b65cab0 00000001dfc47d28 System.String 000000000b65cab8 000000014f621260 System.String 000000000b65cad0 000000014f620fe0 System.String 000000000b65cb00 000000014f620fe0 System.String 000000000b65cb30 000000014f620fe0 System.String ...
四、ObjSize 查看對象大小
ObjSize 用於知道對象地址時,查看該對象的大小。
0:083> !ObjSize 00000001ff350370
sizeof(00000001ff350370) = 32 ( 0x20) bytes (System.String)
五、DumpHeap
顯示關於垃圾收集堆的信息和有關對象的收集統計。
!DumpHeap -type People :統計出含有類名中含有People的對象。
!DumpHeap -mt 79105cd4 : 根據MT結構查詢詳細信息。可以根據MT查詢到Address以用於!do命令。
0:083> !DumpHeap -stat
------------------------------
Heap 0
total 140040 objects
------------------------------
Heap 1
total 108057 objects
------------------------------
...
Heap 23
total 73065 objects
------------------------------
total 2737406 objects
Statistics:
MT Count TotalSize Class Name
000007ff00ff7140 1 24 Comit.TE.Web.Areas.Management.Controllers.PrintProfilesController+PrintProfilesBrief[]
...
000007fef066f000 1170210 28085040 System.Int32
00000000010c12d0 228 32131528 Free
000007fef066f8b0 67392 46915920 System.Collections.Hashtable+bucket[]
000007fef0667d90 291003 96055608 System.String
Total 2737406 objects
Fragmented blocks larger than 0.5 MB:
Addr Size Followed by
000000014f92ff10 4.2MB 000000014fd5c698 System.String
000000019fb89940 6.3MB 00000001a01d57b8 System.Threading.OverlappedData
000000020fb18698 5.7MB 00000002100ccc70 System.Threading.Overlapped
六、DumpArray
DumpArray用於轉儲數組。
0:000> !DumpArray 00000000ffb44c28
Name: System.Object[]
MethodTable: 000007fef0655b80
EEClass: 000007fef026eb88
Size: 96(0x60) bytes
Array: Rank 1, Number of elements 8, Type CLASS
Element Methodtable: 000007fef0667680
[0] 00000000ff5dc768
[1] 000000014f438e50
[2] 00000000ffb44a50
[3] 000000010f668698
[4] 00000000ffb44c10
[5] 00000000ffb44c88
[6] null
[7] null
[0]、[1]、[2]、[3]...就是值的地址,只要!do這個地址就可以查看了。
那麼!DumpArray後面跟的地址又來自哪裏呢?來自於!do命令的第一行Fields的Value:
!dumpheap -stat -> !dumpheap -mt MT列 -> !do Address列 -> !DumpArray Fields第一行Value列 -> !do[0][1][2]
0:000> !DumpObj 00000000ffb44be8
Name: System.Collections.ArrayList
MethodTable: 000007fef066ec78
EEClass: 000007fef0271f10
Size: 40(0x28) bytes
(C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
Fields:
MT Field Offset Type VT Attr Value Name
000007fef0655b80 400094d 8 System.Object[] 0 instance 00000000ffb44c28 _items
000007fef066f000 400094e 18 System.Int32 1 instance 6 _size
000007fef066f000 400094f 1c System.Int32 1 instance 6 _version
000007fef0667680 4000950 10 System.Object 0 instance 0000000000000000 _syncRoot
000007fef0655b80 4000951 388 System.Object[] 0 shared static emptyArray
>> Domain:Value 000000000112bef0:00000001ff354350 000000000372e6e0:00000001ff35bc08 <<
七、FinalizeQueue [-detail]
已進入待終結Finalizer隊列的對象。
0:083> !FinalizeQueue SyncBlocks to be cleaned up: 0 MTA Interfaces to be released: 0 STA Interfaces to be released: 0 ---------------------------------- ------------------------------ Heap 0 generation 0 has 3 finalizable objects (000000002e188cf0->000000002e188d08) generation 1 has 46 finalizable objects (000000002e188b80->000000002e188cf0) generation 2 has 4448 finalizable objects (000000002e180080->000000002e188b80) Ready for finalization 0 objects (000000002e188d08->000000002e188d08) ------------------------------ ... Heap 23 generation 0 has 2963 finalizable objects (00000000329be080->00000000329c3d18) generation 1 has 0 finalizable objects (00000000329be080->00000000329be080) generation 2 has 0 finalizable objects (00000000329be080->00000000329be080) Ready for finalization 0 objects (00000000329c3d18->00000000329c3d18) Statistics: MT Count TotalSize Class Name 000007fef0681898 1 24 System.Threading.OverlappedDataCache ... 000007fef0690639 8779 632088 UNKNOWN 000007fef065f2a9 40751 1304032 UNKNOWN 000007fef065f2a8 41408 1325056 System.WeakReference Total 92039 objects
一、ThreadPool 線程池相關信息
顯示託管線程池的有關信息,包括在隊列中工做請求的數目、徹底端口線程的數目、和計時器數目。
0:083> !ThreadPool
CPU utilization 81%
Worker Thread: Total: 24 Running: 21 Idle: 3 MaxLimit: 2147483647 MinLimit: 24
Work Request in Queue: 45
AsyncTimerCallbackCompletion TimerInfo@000000001043dee0
AsyncTimerCallbackCompletion TimerInfo@000000001043dee0
...
AsyncTimerCallbackCompletion TimerInfo@00000000108d4140
AsyncTimerCallbackCompletion TimerInfo@00000000108c9c20
--------------------------------------
Number of Timers: 55
--------------------------------------
Completion Port Thread:Total: 1 Free: 1 MaxFree: 48 CurrentLimit: 0 MaxLimit: 2147483647 MinLimit: 24
CPU utilization:佔用CPU百分比;
Worker Thread: 工做線程統計:
Completion Port Thread:I/O線程數統計:
二、Threads [-live] [-special]
顯示進程中全部的託管線程。
0:083> !Threads -special
ThreadCount: 32
UnstartedThread: 0
BackgroundThread: 32
PendingThread: 0
DeadThread: 0
Hosted Runtime: no
PreEmptive Lock
ID OSID ThreadOBJ State GC GC Alloc Context Domain Count APT Exception
61 2 a8a0 00000000036eeb30 b220 Enabled 0000000000000000:0000000000000000 000000000112bef0 0 MTA (Finalizer)
...
OSID Special thread type
35 59f8 IOCompletion
36 7f2c DbgHelper
37 eb0 GC SuspendEE
60 19d0 GC
61 a8a0 Finalizer
62 547c Timer
63 8c2c ADUnloadHelper
64 2fc ThreadpoolWorker
87 8ce4 ThreadpoolWorker
...
三、clrstack [-a] [-l] [-p]
當前線程的託管代碼調用堆棧。
0:083> !clrstack
OS Thread Id: 0x6914 (83)
Child-SP RetAddr Call Site
000000000b65cae0 000007ff00cf0313 System.String.Concat(System.String, System.String, System.String)
000000000b65cb40 000007ff012b0ac5 xx.TE.Web.Service.Management.CompositeFieldService.GetCompositeFieldContent(System.Web.HttpContextBase, System.String, Comit.TE.Web.Domain.Management.CompositeField, Int32)
000000000b65cfd0 000007ff0126d39b xx.TE.Web.Areas.Cases.Controllers.WritDataBagController.PageWritContent(System.String, Int32)
000000000b65d410 000007fee7ca082c DynamicClass.lambda_method(System.Runtime.CompilerServices.ExecutionScope, System.Web.Mvc.ControllerBase, System.Object[])
000000000b65d460 000007fee7ca31ef System.Web.Mvc.ReflectedActionDescriptor.Execute(System.Web.Mvc.ControllerContext, System.Collections.Generic.IDictionary`2<System.String,System.Object>)
000000000b65d4c0 000007fee7ca47b5 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(System.Web.Mvc.ControllerContext, System.Web.Mvc.ActionDescriptor, System.Collections.Generic.IDictionary`2<System.String,System.Object>)
...
這個命令是sos.dll的支持,若是但願顯示當前線程的非託管代碼調用堆棧,應該使用kb。
此處還有一種寫法~*e!clrstack:此命令用於顯示全部線程的託管代碼調用堆棧。
四、DumpStack
!clrstack只顯示託管代碼,而!kb只顯示非託管代碼。而DumpStack則是以上兩個命令的綜合版。既顯示託管代碼堆棧也顯示非託管代碼堆棧。-EE 選項使DumpStack命令只顯示託管函數。
0:083> !dumpstack OS Thread Id: 0x6914 (83) Child-SP RetAddr Call Site 000000000b65c468 000007fefd6d10dc ntdll!ZwWaitForSingleObject+0xa 000000000b65c470 000007fef128d0e0 KERNELBASE!WaitForSingleObjectEx+0x79 000000000b65c510 000007fef128d1e3 mscorwks!MethodTableBuilder::MethodSignature::GetMethodAttributes+0xa8 000000000b65c560 000007fef138e250 mscorwks!CLREvent::WaitEx+0x63 000000000b65c610 000007fef15a9596 mscorwks!SVR::gc_heap::wait_for_gc_done+0x80 000000000b65c650 000007fef17339cc mscorwks!SVR::GCHeap::GarbageCollectGeneration+0x206 000000000b65c6b0 000007fef13996a2 mscorwks!SVR::gc_heap::try_allocate_more_space+0x1ac 000000000b65c7a0 000007fef136ecef mscorwks!SVR::gc_heap::allocate_more_space+0x32 000000000b65c7f0 000007fef12d7278 mscorwks!SVR::gc_heap::allocate_large_object+0x5f 000000000b65c860 000007fef12d758e mscorwks!SVR::GCHeap::Alloc+0x198 000000000b65c8a0 000007fef17b9433 mscorwks!SlowAllocateString+0x7e 000000000b65c920 000007fef051beec mscorwks!FramedAllocateString+0xd3 000000000b65cae0 000007ff00cf0313 mscorlib_ni!System.String.Concat(System.String, System.String, System.String)+0x4c 000000000b65cb40 000007ff012b0ac5 xxx_TE_Web_Service!xxx.TE.Web.Service.Management.CompositeFieldService.GetCompositeFieldContent(System.Web.HttpContextBase, System.String, Comit.TE.Web.Domain.Management.CompositeField, Int32)+0x13d3 000000000b65cfd0 000007ff0126d39b xxx_TE_Web!xxx.TE.Web.Areas.Cases.Controllers.WritDataBagController.PageWritContent(System.String, Int32)+0x6a5
...
五、進程信息
在調試會話中,有時候得到關於被調試進程的更多信息是很是有用的。例如,內存使用量,環境變量,處理時間等,這些數據都是很是有用的。要在調試時將這些信息轉儲出來,可使用ProInfo命令。語法以下:
!ProcInfo [-env][-time][-mem]
其中-env、-time、-mem等開關控制着所要顯示的進程信息。若是沒有指定任何開關,那麼會顯示全部者三類信息。
在時候調試Dump File裏面試不支持這個命令的。
0:000> !ProcInfo
---------------------------------------
Environment
=::=::\
ALLUSERSPROFILE=C:\ProgramData
ANALYSIS_PATH=D:\LoadRunner\
APPDATA=C:\Users\ChenZhuo\AppData\Roaming
ClassPath=.;%JAVE_HOME%lib/rt.jar;C:\Program Files\Java\jdk1.6.0_24lib/tools.jar
CommonProgramFiles=C:\Program Files\Common Files
COMPUTERNAME=CZZ
ComSpec=C:\Windows\system32\cmd.exe
CURR_DIR=D:\LoadRunner\dat\Setup\LoadRunner\MSBuild\..\..\..\..
FP_NO_HOST_CHECK=NO
FTP_PASSIVE=1
HOMEDRIVE=C:
HOMEPATH=\Users\ChenZhuo
JAVA_HOME=C:\Program Files\Java\jdk1.6.0_24
LG_PATH=D:\LoadRunner\
LOCALAPPDATA=C:\Users\ChenZhuo\AppData\Local
LOGGER_CONFIG_PATH=D:\LoadRunner\dat\ltlogconf.xml
LOGONSERVER=\\CZZ
LOG_FILE=C:\Users\ChenZhuo\AppData\Local\Temp\ihp_custom_batches.log
LR_PATH=D:\LoadRunner\
LR_ROOT=D:\LoadRunner\
NUMBER_OF_PROCESSORS=4
OS=Windows_NT
Path=C:\Program Files\Debugging Tools for Windows (x86)\winext\arcade;%JAVA_HOME%/bin;c:\oracle\product\10.2.0\client_1\bin;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;...省略
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 6 Model 42 Stepping 7, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=2a07
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
---------------------------------------
Process Times
Process Started at: 2014 May 30 16:23:12.21
Kernel CPU time : 0 days 00:00:00.01
User CPU time : 0 days 00:00:00.01
Total CPU time : 0 days 00:00:00.02
---------------------------------------
Process Memory
WorkingSetSize: 6820 KB PeakWorkingSetSize: 6820 KB
VirtualSize: 97744 KB PeakVirtualSize: 98272 KB
PagefileUsage: 6816 KB PeakPagefileUsage: 6824 KB
---------------------------------------
54 percent of memory is in use.
Memory Availability (Numbers in MB)
Total Avail
Physical Memory 3486 1585
Page File 4095 3019
Virtual Memory 2047 1819
一、GCRoot
!GCRoot是一個很是有用的命令,它可以幫助咱們發現某對象上目前還存在的有效引用。這也是爲何GC還不回收這個對象的緣由。這個信息能夠很好的幫助咱們分析那些本應該沒有引用,但卻一直還存在有效引用的對象,由此發現咱們代碼中潛在的內存泄漏,同時咱們也能夠觀察到哪些對象是目前沒有引用了。
0:000> !gcroot 000000011f993008
Note: Roots found on stacks may be false positives. Run "!help gcroot" for
more info.
Scan Thread 22 OSTHread 3468
Scan Thread 61 OSTHread a8a0
Scan Thread 62 OSTHread 547c
Scan Thread 63 OSTHread 8c2c
Scan Thread 64 OSTHread 2fc
Scan Thread 65 OSTHread 90a4
RSP:aced0e8:Root:000000012f453b98(IBatisNet.DataMapper.MappedStatements.SelectMappedStatement)->
000000014f459390(IBatisNet.DataMapper.SqlMapper)->
000000014f459480(System.Collections.Specialized.HybridDictionary)->
000000014f5d8140(System.Collections.Hashtable)->
00000001ff6f5e38(System.Collections.Hashtable+bucket[])->
00000000ff5e7298(IBatisNet.DataMapper.Configuration.Cache.CacheModel)->
00000000ff5e7560(IBatisNet.DataMapper.Configuration.Cache.Memory.MemoryCacheControler)->
00000000ff5e75d8(System.Collections.Hashtable+SyncHashtable)->
00000000ff5e7580(System.Collections.Hashtable)->
000000028f350080(System.Collections.Hashtable+bucket[])->
000000011f992fd8(IBatisNet.DataMapper.Configuration.Cache.CacheKey)->
000000011f993008(System.Collections.ArrayList)
Scan Thread 66 OSTHread 11d0
Scan Thread 67 OSTHread 2928
Scan Thread 68 OSTHread a2a4
Scan Thread 69 OSTHread 2554
如上面可以查看到某對象被引用的關係。
一、EEVersion
顯示公共語言運行時版本。
0:061> !EEVersion
2.0.50727.5477 free
Server mode with 24 gc heaps
SOS Version: 2.0.50727.5477 retail build
上面的輸出顯示有24個GC堆(24核CPU),.Net版本爲2.0.50727.5477。同時,該命令還輸出了正在使用的SOS版本。
二、EEStack [-short] [-EE]
對進程中的全部線程執行DumpStack命令,-EE 選項被直接傳遞給DumpStack命令。-short 參數限制輸入內容爲如下線程種類:
已經被鎖定的線程。
爲了容許垃圾收集已經被遲延的線程。
目前處於託管代碼中的線程。
0:083> !EEStack
---------------------------------------------
Thread 22
Child-SP RetAddr Call Site
000000000189fb88 000007fefd6d16ad ntdll!ZwRemoveIoCompletion+0xa
000000000189fb90 000000007750a4e1 KERNELBASE!GetQueuedCompletionStatus+0x39
000000000189fbf0 000007fef5701f7b kernel32!GetQueuedCompletionStatusStub+0x11
000000000189fc30 000007fef5702024 w3tp!THREAD_POOL_DATA::ThreadPoolThread+0x3b
000000000189fc80 000007fef57020a1 w3tp!THREAD_POOL_DATA::ThreadPoolThread+0x34
000000000189fcb0 000000007751652d w3tp!THREAD_MANAGER::ThreadManagerThread+0x61
000000000189fce0 000000007764c541 kernel32!BaseThreadInitThunk+0xd
000000000189fd10 0000000000000000 ntdll!RtlUserThreadStart+0x1d
---------------------------------------------
Thread 61
Child-SP RetAddr Call Site
000000000946f388 000007fefd6d10dc ntdll!ZwWaitForSingleObject+0xa
000000000946f390 000007fef128d0e0 KERNELBASE!WaitForSingleObjectEx+0x79
000000000946f430 000007fef128d1e3 mscorwks!MethodTableBuilder::MethodSignature::GetMethodAttributes+0xa8
000000000946f480 000007fef124bbf9 mscorwks!CLREvent::WaitEx+0x63
000000000946f530 000007fef124bd82 mscorwks!SVR::WaitForFinalizerEvent+0x49
...