SOS調試擴充讓你可以檢視在公共語言運作時裡面運作的代碼的有關資訊。例如,你可以使用SOS調試擴充顯示托管堆的有關資訊,查找堆的錯誤,顯示運作時使用的内部資料類型,以及檢視在運作時裡面運作的所有托管代碼的有關資訊。
使用SOS調試擴充的辦法是把它裝入到WinDbg.exe調試器,或者Visual Studio
2005或它的更早版本。你能夠在WinDgb.exe裡或者在Visual Studio的即時視窗裡面執行令來載入它。
在Windbg.exe中裝載SOS的指令是:
如果使用的.Net版本不同,那麼還可以手動指定版本,如手動指定載入4.0版本指令:
SOS.dll 随 .NET Framework 安裝在
%windir%\microsoft.net\framework\<.NET 版本> 目錄下。
SOS擴充指令清單:
指令
描述
BPMD [<module
name> <method name>]
[-md <MethodDesc>]
建立一個斷點在指定子產品的指定方法上。
如果指定子產品和方法尚未被載入,該指令等到該子產品被載入并且被即時(just-in-time)編譯的通知後再建立斷點。
CLRStack [-a]
[-l] [-p]
隻提供托管代碼的棧跟蹤。
-p 選項顯示托管函數的參數。
-l 選項顯示在一個架構裡局部變量的資訊。SOS調試擴充無法檢索局部變量的名字,是以局部變量的輸出格式為<local
address> = <value>。
-a (all)
選項是-l和-p組合的快捷方式。
在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>
顯示在指定位址上的一個Sig結構的有關資訊。
DumpStackObjects [-verify]
[top stack [bottom stack]]
DSO [-verify] [top 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類派生對象的字段。如果你沒有指定一個位址,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
通過指定一個指向某個方法MethodDesc結構的指針或者指定其方法體裡面的一個代碼位址,顯示一個托管方法有注釋的反彙編。U指令顯示整個方法,從開始到完成,并在注釋裡把中繼資料标記轉換為名字。
-gcinfo 選項使U指令顯示這個方法使用的GCInfo結構。
-ehinfo 選項顯示這個方法的異常資訊。你也可以用EHInfo指令來擷取該資訊。
VerifyHeap
檢查垃圾收集器堆的崩潰标志,顯示發現的任何錯誤。
堆崩潰能夠由不正确地構成的平台援用(platform invoke)調用引起。
VMMap
橫跨虛拟位址空間,顯示加諸每區域的保護類型。
VMStat
按照加諸記憶體的保護類型(自由的free、保留的reserved、限制的committed、私有的private、映射的mapped、映像image)順序,提供虛拟位址空間的概覽。TOTAL欄顯示AVERAGE欄乘以BLK
COUNT欄的結果。