共用方式為


SOS 偵錯擴充功能 (SOS.dll)

更新:2007 年 11 月

SOS 偵錯擴充功能 (SOS.dll) 提供內部 Common Language Runtime (CLR) 環境的相關資訊,以協助您在 WinDbg.exe 偵錯工具和 Visual Studio 中偵錯 Managed 程式。

![command] [options] 

命令

命令

描述

BPMD [<module name> <method name>] [-md <MethodDesc>]

在所指定模組中的指定方法建立中斷點。

如果指定的模組和方法尚未載入,這個命令便會在建立中斷點之前等待已載入模組和已完成 Just-in-Time 編譯的通知。

CLRStack [-a] [-l] [-p]

僅提供 Managed 程式碼的堆疊追蹤。

-p 選項會顯示 Managed 函式的引數。

-l 選項會顯示框架 (Frame) 中區域變數的相關資訊。SOS 偵錯擴充功能無法擷取區域名稱,因此區域名稱之輸出的格式會是 <local address> = <value。

-a (全部) 選項是 -l-p 組合的捷徑。

SOS 偵錯擴充功能不會在 x64 和 IA-64 架構平台上顯示轉換框架。

COMState

列出每個執行緒和 Context 指標的 COM Apartment Model (如果有)。

DumpArray [-start <startIndex>] [-length <length>] [-details] [-nofields] <array object address>

-或-

DA [-start <startIndex>] [-length <length>] [-detail] [-nofields] array object address>

檢查陣列物件的元素。

-start 選項會指定開始顯示元素的索引。

-length 選項會指定要顯示多少元素。

-detail 選項會使用 DumpObjDumpVC 格式來顯示元素的詳細資料。

-nofields 選項會防止陣列顯示。這個選項只有在指定 -detail 選項時才能使用。

DumpAssembly <Assembly address>

顯示關於組件 (Assembly) 的資訊。

DumpAssembly 命令會列出多個模組 (如果這些模組存在)。

您可以使用 DumpDomain 命令取得組件位址。

DumpClass <EEClass address>

顯示與某個型別關聯之 EEClass 結構的資訊。

DumpClass 命令會顯示靜態 (Static) 欄位值,但不會顯示非靜態欄位值。

使用 DumpMTDumpObjName2EEToken2EE 命令,便可取得 EEClass 結構位址。

DumpDomain [<Domain address>]

列舉載入於所指定 AppDomain 物件位址內的每個 Assembly 物件。當不使用參數進行呼叫時,DumpDomain 命令便會列出處理序中的所有 AppDomain 物件。

DumpHeap [-stat] [-min <size>][-max <size>] [-thinlock] [-mt <MethodTable address>] [-type <partial type name>][start [end]]

顯示記憶體回收堆積 (Heap) 的資訊,以及關於物件的回收統計資料。

DumpHeap 命令會在偵測到記憶體回收行程堆積中出現過多分割時顯示警告。

-stat 選項會限制輸出至統計類型的摘要。

-min 選項會忽略小於 size 參數的物件 (指定單位為位元組)。

-max 選項會忽略大於 size 參數的物件 (指定單位為位元組)。

-thinlock 選項會報告 ThinLocks。如需詳細資訊,請參閱 SyncBlk 命令。

-mt 選項只會列出會對應到已指定於 MethodTable 結構中之物件的物件。

-type 選項只會列出其型別名稱即為所指定字串之子字串的物件。

start 參數會從指定的位址開始列出。

end 參數會在指定的位址停止列出。

DumpIL [<DynamicMethod address>] [<DynamicMethodDesc address>] [<MethodDesc address>]

顯示與 Managed 方法關聯的中繼語言 (Intermediate Language,IL)。

請注意動態 (Dynamic) IL 的發出方式不同於從組件載入的 IL。動態 IL 會參考 Managed 物件陣列中的物件,而非參考中繼資料 (Metadata) 語彙基元 (Token)。

DumpLog [<Filename>]

將記憶體中壓力記錄檔的內容寫入指定的檔案。如果沒有指定名稱,此命令便會在目前的目錄中建立名為 Stresslog.txt 的檔案。

Common Language Runtime 提供記憶體中的壓力記錄檔,以協助您診斷壓力失敗。該記錄檔讓您能夠診斷失敗,而不需要使用鎖定或 I/O。若要啟用壓力記錄檔,請在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework 之下設定下列登錄機碼:

(DWORD) StressLog = 1

(DWORD) LogFacility = 0xffffffff

(DWORD) StressLogSize = 65536

DumpMD <MethodDesc address>

在指定的位址顯示 MethodDesc 結構的相關資訊。

您可以使用 IP2MD 命令,從 Managed 函式取得 MethodDesc 結構位址。

DumpMT [-MD] <MethodTable address>

顯示在所指定位址之方法資料表的相關資訊。指定 -MD 選項,便會顯示與物件一起定義之所有方法的清單。

每個 Managed 物件都包含一個方法資料表指標。

DumpMethodSig <sigaddr> <moduleaddr>

顯示在所指定位址之 MethodSig 結構的相關資訊。

DumpModule [-mt] <Module address>

顯示在所指定位址之模組的相關資訊。-mt 選項會顯示定義在模組中的型別,以及由該模組所參考的型別。

您可以使用 DumpDomainDumpAssembly 命令來擷取模組的位址。

DumpObj <object address>

-或-

DO <object address>

顯示在所指定位址之物件的相關資訊。DumpObj 命令會顯示欄位、EEClass 結構資訊、方法資料表,以及物件的大小。

您可以使用 DumpStackObjects 命令來擷取物件的位址。

請注意您可以對 CLASS 型別的欄位執行 DumpObj 命令,因為這些欄位也是物件。

DumpRuntimeTypes

顯示記憶體回收行程堆積中的執行階段型別物件,並列出與其關聯的型別名稱和方法資料表。

DumpStack [-EE] [top stack [bottom stack]]

顯示堆疊追蹤。

-EE 選項會使 DumpStack 命令只顯示 Managed 函式。使用 topbottom參數可限制在 x86 平台上顯示的堆疊框架 (Stack Frame)。

在 x86 平台上,DumpStack 命令會建立詳細的堆疊追蹤。

在 x64 和 IA-64 架構平台上,DumpStack 命令會模擬偵錯工具的 K 命令。topbottom參數在 x64 和 IA-64 架構平台上會遭到忽略。

DumpSig <sigaddr> <moduleaddr>

顯示在所指定位址之 Sig 結構的相關資訊。

DumpStackObjects [-verify] [top stack [bottom stack]]

-或-

DSO [-verify] [top stack [bottom stack]]

顯示可在目前堆疊界限內找到的所有 Managed 物件。

-verify 選項會驗證物件欄位的每個非靜態 CLASS 欄位。

使用 DumpStackObject 命令和追蹤命令 (例如 K 命令和 CLRStack 命令),即可判斷區域變數和參數的值。

DumpVC <MethodTable address> <Address>

顯示在所指定位址之實值類別 (Class) 欄位的相關資訊。

MethodTable 參數可讓 DumpVC 命令正確地解譯欄位。實值類別並未以方法資料表做為其第一個欄位。

EEHeap [-gc] [-loader]

顯示由內部 Common Language Runtime 資料結構使用的處理序記憶體相關資訊。

-gc-loader 選項會將這個命令的輸出限制到記憶體回收行程或載入器資料結構。

記憶體回收行程的資訊會列出 Managed 堆積中每個區段的範圍。如果指標位於 EEHeap -gc 所指定的區段範圍內,該指標就是物件指標。

EEStack [-short] [-EE]

在處理序中的所有執行緒上執行 DumpStack 命令。

-EE 選項會直接傳遞到 DumpStack 命令。-short 參數會將輸出限制到下列種類的執行緒:

  1. 具有鎖定的執行緒。

  2. 已經停止以便允許記憶體回收的執行緒。

  3. 目前在 Managed 程式碼中的執行緒。

EEVersion

顯示 Common Language Runtime 版本。

EHInfo [<MethodDesc address>] [<Code address>]

顯示所指定方法中的例外狀況 (Exception) 處理區塊。這個命令會顯示子句區塊 (try 區塊) 和處理常式區塊 (catch 區塊) 的程式碼位址和位移 (Offset)。

FinalizeQueue [-detail]

顯示所有已註冊為結束的物件。

-detail 選項會顯示等待清除之任何 SyncBlocks 的其他資訊,以及等待清除之任何 RuntimeCallableWrappers (RCW) 的額外資訊。這兩種資料結構都會由完成項執行緒進行快取和清除。

FindAppDomain <Object address>

判斷在所指定位址之物件的應用程式定義域。

GCHandles [-perdomain]

顯示處理序中記憶體回收行程控制代碼的統計資料。

傳遞 -perdomain 選項,便會依據應用程式定義域排列統計資料。

使用 GCHandles 命令,便可找出由記憶體回收行程控制代碼遺漏造成的記憶體遺漏 (Memory Leak)。例如,當程式碼保留大型陣列時就會發生記憶體遺漏,其保留的原因是因為強式記憶體回收行程控制代碼依然指向該陣列,而捨棄控制代碼時卻未釋放陣列。

GCHandleLeaks

在處理序中搜尋強式和 Pin 記憶體回收行程控制代碼之任何參考的記憶體,並顯示結果。如果有找到控制代碼,GCHandleLeaks 命令便會顯示該參考的位址。如果在記憶體中沒有找到任何控制代碼,這個命令便會顯示通知。

GCInfo <MethodDesc address><Code address>

顯示指出註冊位置或堆疊位置在何時包含 Managed 物件的資料。進行記憶體回收時,回收行程必須知道物件參考的位置,以便能夠用新的物件指標值來更新這些參考。

GCRoot [-nostacks] <Object address>

顯示在所指定位址之物件參考 (或根目錄) 的相關資訊。

GCRoot 命令會在整個 Managed 堆積和控制碼表格中,檢查位於堆疊上之其他物件和控制代碼中的控制代碼。然後,在每個堆疊上搜尋物件的指標,同時搜尋完成項佇列。

這個命令不會判斷堆疊根目錄是否有效或是已遭捨棄。使用 CLRStackU 命令,便可分解區域或引數值所屬的框架,以便判斷該堆疊根目錄是否仍在使用中。

-nostacks 選項會將搜尋限制到記憶體回收行程控制代碼和可能執行的物件。

help [<command>] [<faq>]

顯示當未指定任何參數時的所有可用命令,或是顯示所指定命令的詳細說明資訊。

faq 參數會顯示常見問題集的解答。

IP2MD <Code address>

顯示在已進行 Just-in-Time (JIT) 編譯之程式碼中之指定位址的 MethodDesc 結構。

MinidumpMode [0] [1]

防止在使用小型傾印 (Minidump) 時執行 Unsafe 命令。

傳遞 0 便可停用這項功能,而傳遞 1 便可啟用這項功能。根據預設,會將 MinidumpMode 值會設定為 0

.dump /m 命令或 .dump 命令建立的小型傾印,都具有有限的 CLR 特定資料,並只允許您正確執行 SOS 命令的子集。有些命令可能會因未預期的錯誤而失敗,原因是沒有對應或是只有部分對應到必要的記憶體區域。這個選項可防止您對小型傾印執行 Unsafe 命令。

Name2EE <module name> <type or method name>

-或-

Name2EE <module name>!<type or method name>

顯示所指定模組中之指定型別或方法的 MethodTable 結構和 EEClass 結構。

指定的模組必須載入到處理序。

若要取得適當的型別名稱,請使用 MSIL 反組譯工具 (Ildasm.exe) 瀏覽該模組。您也可以將 * 當做模組名稱參數傳遞,以便搜尋所有已載入的 Managed 模組。module name 參數也可以是模組的偵錯工具名稱,例如 mscorlib 或 image00400000。

這個命令支援 <module>!<type> 的 Windows 偵錯工具語法。這個型別必須具有完整名稱。

ObjSize [<Object address>]

顯示所指定物件的大小。在不使用參數時,ObjSize 命令會顯示在 Managed 執行緒上找到之所有物件的大小,並會顯示處理序中的所有記憶體回收行程控制代碼,以及這些控制代碼所指向之任何物件的總大小。ObjSize 命令會包括父代 (Parent) 和其他所有子物件的大小。

PrintException [-nested] [<Exception object address>]

-或-

PE [-nested] [<Exception object address>]

顯示並格式化在所指定位址且衍生自 Exception 類別之任何物件的欄位。如果您沒有指定位址,PrintException 命令便會顯示目前執行緒上最近一次擲回的例外狀況。

-nested 選項會顯示巢狀例外狀況物件的詳細資料。

您可以使用這個命令來格式化和檢視 _stackTrace 欄位,此欄位屬於二進位陣列。

ProcInfo [-env] [-time] [-mem]

顯示處理序的環境變數、核心 (Kernel) 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 結構是專門放置並非每一個物件都要建立之額外資訊的容器 (Container)。其中可以包含 COM Interop 資料、雜湊程式碼,以及安全執行緒 (Thread-Safe) 作業的鎖定資訊。

ThreadPool

顯示 Managed 執行緒集區的相關資訊,其中包括佇列中的工作要求數目、完成連接埠執行緒的數目,以及計時器的數目。

Token2EE <module name> <token>

將所指定模組中的已指定中繼資料語彙基元變成 MethodTable 結構或 MethodDesc 結構。

您可以將 * 當做模組名稱參數傳遞,便可了解該語彙基元對應至每一個載入之 Managed 模組中的哪個項目。您也可以傳遞模組的偵錯工具名稱,例如 mscorlib 或 image00400000。

Threads [-live] [-special]

顯示處理序中的所有 Managed 執行緒。

Threads 命令會顯示偵錯工具簡略 ID、Common Language Runtime 執行緒 ID,以及作業系統執行緒 ID。此外,Threads 命令也會顯示指出執行緒執行所在之應用程式定義域的 Domain 資料行、顯示 COM Apartment 模式的 APT 資料行,以及顯示執行緒中最近一次擲回之例外狀況的 Exception 資料行。

-live 選項會顯示與運作中執行緒關聯的執行緒。

-special 選項會顯示由 CLR 建立的所有特殊執行緒。特殊執行緒包括記憶體回收 (GC) 執行緒 (在並行的 GC 和伺服器 GC 中)、Debugger Helper 執行緒、Finalizer 執行緒、AppDomain Unload 執行緒,以及 Threadpool 計時器執行緒。

TraverseHeap [-xml] <filename>

使用 CLR 分析工具 (Profiler) 可以辨識的格式,將堆積資訊寫入指定的檔案。-xml 選項會使 TraverseHeap 命令將檔案的格式設定為 XML。

您可以從 Microsoft 下載中心下載 CLR 分析工具。

U [-gcinfo] [-ehinfo] <MethodDesc address> | <Code address>

顯示由方法之 MethodDesc 結構指標或由方法主體內之程式碼位址所指定 Managed 方法的註解反組譯碼。U 命令會顯示從開始到結束的整個方法,以及將中繼資料語彙基元轉換成名稱的附註。

-gcinfo 選項會使 U 命令顯示方法的 GCInfo 結構。

-ehinfo 選項會顯示方法的例外狀況資訊。您也可以用 EHInfo 命令取得這項資訊。

VerifyHeap

檢查記憶體回收行程堆積是否有損毀徵兆,並顯示任何所發現的錯誤。

堆積損毀的原因可能是平台叫用 (Invoke) 架構不正確的呼叫。

VMMap

周遊虛擬位址空間,並顯示每個區域所套用的保護類型。

VMStat

提供虛擬位址空間的摘要檢視,並依據套用至該記憶體的各種保護類型 (無限制、保留、認可、私用、對應、影像) 進行排列。TOTAL 資料行會顯示 AVERAGE 資料行乘以 BLK COUNT 資料行的結果。

備註

將 SOS 偵錯擴充功能載入至 WinDbg.exe 偵錯工具 (該偵錯工具可從 Debugging Tools for Windows 網站取得),或是載入至 Visual Studio 2005 或之前版本以便使用。您可以在 WinDgb.exe 內或 Visual Studio 的「即時運算視窗」內執行命令。

SOS 偵錯擴充功能讓您能夠檢視在 Common Language Runtime 內執行之程式碼的相關資訊。例如,您可以使用 SOS 偵錯擴充功能來顯示 Managed 堆積的相關資訊、尋找堆積損毀、顯示執行階段所使用的內部資料型別,並檢視在執行階段內執行之所有 Managed 程式碼的資訊。

載入 SOS 偵錯擴充功能

若要在 WinDbg.exe 偵錯工具中載入 SOS 偵錯擴充功能,請在此工具中執行下列命令;若要在 Visual Studio 中載入 SOS 偵錯擴充功能,則請在進行偵錯時同時於即時運算視窗中執行下列命令:

.loadby sos mscorwks

您必須先在方案的專案設定中啟用 Unmanaged 偵錯,才能開始載入 SOS 偵錯擴充功能。對於部分語言來說,Unmanaged 偵錯預設為停用狀態。

注意:若要在 Visual Studio 2005 中顯示即時運算視窗,請按一下 [偵錯] 功能表,按一下 [視窗] 功能表,再按一下 [即時運算] 選項。您也可以選取 CTRL-ALT-I,以便在 Visual Studio 中開啟即時運算視窗。

WinDbg.exe 和 Visual Studio 都會使用對應於目前使用中之 Mscorwks.dll 版本的 SOS.dll 版本。在 .NET Framework 的 1.1 和 2.0 版中,SOS.dll 都是安裝在相同於 Mscorwks.dll 的目錄中。根據預設,您應該使用符合目前 Mscorwks.dll 版本的 SOS.dll 版本。

若要使用在另一部電腦上建立的傾印檔案,請確定此次安裝所隨附的 Mscorwks.dll 檔案已出現在您的符號路徑中,然後載入對應的 SOS.dll 版本。

若要載入特定的 SOS.dll 版本,請在 Windows 偵錯工具中輸入下列命令:

.load <full path to sos.dll>

範例

下列命令會顯示在位址 00ad28d0 之陣列的內容。顯示會從第二個元素開始,然後連續顯示五個元素。

!dumparray -start 2 -length 5 -detail 00ad28d0 

下列命令會顯示在位址 1ca248 之組件的內容。

!dumpassembly 1ca248

下列命令會顯示記憶體回收行程堆積的相關資訊。

!dumpheap

下列命令會將記憶體中壓力記錄檔的內容,寫入目前目錄中名為 Stresslog.txt 的檔案。

!DumpLog

下列命令會顯示在位址 902f40 的 MethodDesc 結構。

!dumpmd 902f40

下列命令會顯示在位址 1caa50 之模組的相關資訊。

!dumpmodule 1caa50

下列命令會顯示在位址 a79d40 之物件的相關資訊。

!DumpObj a79d40

下列命令會使用在位址 0090320c 的方法資料表,顯示在位址 00a79d9c 之實值類別的欄位。

!DumpVC 0090320c 00a79d9c

下列命令會顯示記憶體回收行程所使用的處理序記憶體。

!eeheap -gc

下列命令會顯示已排程為結束的所有物件。

!finalizequeue

下列命令會判斷在位址 00a79d98.之物件的應用程式定義域。

!findappdomain 00a79d98

下列命令會顯示目前處理序中的所有記憶體回收行程控制代碼。

!gcinfo 5b68dbb8 

下列命令會顯示 unittest.exe 模組中,MainClass 類別之 Main 方法的 MethodTable 和 EEClass 結構。

!name2ee unittest.exe MainClass.Main

下列命令會顯示 unittest.exe 模組中,在位址 02000003 之中繼資料語彙基元的相關資訊。

!token2ee unittest.exe 02000003

請參閱

參考

.NET Framework 工具

SDK 命令提示字元