SOS.dll (SOS 偵錯擴充功能)
更新:2011 年 4 月
SOS 偵錯擴充功能 (SOS.dll) 提供內部 Common Language Runtime (CLR) 環境的相關資訊,以協助您在 WinDbg.exe 偵錯工具和 Visual Studio 中偵錯 Managed 程式。 這個工具需要您的專案已啟用非 Managed 偵錯。 您也可以使用 SOS 偵錯擴充功能搭配 Windows 偵錯工具 (WinDbg.exe)。
這個工具會自動隨 Visual Studio 和 Windows SDK 一起安裝。 若要執行工具,建議您使用 Visual Studio 命令提示字元或 Windows SDK 命令提示字元。 這些公司可讓您輕鬆地執行工具,而不需瀏覽至安裝資料夾。 如需詳細資訊,請參閱Visual Studio 和 Windows SDK 命令提示字元。
如果您已經在電腦上安裝 Visual Studio:在工作列上,依序按一下 Start、All Programs、Visual Studio、Visual Studio Tools,然後按一下 Visual Studio Command Prompt。
-或-
如果您已經在電腦上安裝 Windows SDK:在工作列上,依序按一下 Start、All Programs、Windows SDK 的資料夾,然後按一下Command Prompt(或 CMD Shell)。
在命令提示字元中輸入下列文字:
![command] [options]
命令
命令 |
描述 |
---|---|
AnalyzeOOM (ao) |
顯示在記憶體回收堆積的配置要求上,最後發生之 OOM 的資訊。 (在伺服器記憶體回收中,它會顯示每個記憶體回收堆積上的 OOM (如果存在))。 |
BPMD [-nofuturemodule] [<module name> <method name>] [-md <MethodDesc>] -list -clear <pending breakpoint number> -clearall |
在所指定模組中的指定方法建立中斷點。 如果指定的模組和方法尚未載入,這個命令便會在建立中斷點之前,等待已載入模組和已完成 Just-in-Time (JIT) 編譯的通知。 您可以使用 -list、-clear 和 -clearall 選項來管理暫止中斷點的清單:
|
CLRStack [-a] [-l] [-p] [-n] |
僅提供 Managed 程式碼的堆疊追蹤。
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> |
檢查陣列物件的元素。
|
DumpAssembly <assembly address> |
顯示關於組件 (Assembly) 的資訊。 DumpAssembly 命令會列出多個模組 (如果這些模組存在)。 您可以使用 DumpDomain 命令取得組件位址。 |
DumpClass <EEClass address> |
顯示與某個型別關聯之 EEClass 結構的資訊。 DumpClass 命令會顯示靜態 (Static) 欄位值,但不會顯示非靜態欄位值。 使用 DumpMT、DumpObj、Name2EE 或 Token2EE 命令,便可取得 EEClass 結構位址。 |
DumpDomain [<domain address>] |
列舉載入於所指定 AppDomain 物件位址內的每個 Assembly 物件。 當不使用參數進行呼叫時,DumpDomain 命令便會列出處理序中的所有 AppDomain 物件。 |
DumpHeap [-stat] [-strings] [-short] [-min <size>] [-max <size>] [-thinlock] [-startAtLowerBound] [-mt <MethodTable address>] [-type <partial type name>][start [end]] |
顯示記憶體回收堆積 (Heap) 的資訊,以及關於物件的回收統計資料。 DumpHeap 命令會在偵測到記憶體回收行程堆積中出現過多分割時顯示警告。
|
DumpIL <Managed DynamicMethod object> | <DynamicMethodDesc pointer> | <MethodDesc pointer> |
顯示與 Managed 方法相關聯的 Microsoft 中繼語言 (MSIL)。 請注意,動態 MSIL 的發出方式不同於從組件載入的 MSIL。 動態 MSIL 會參考 Managed 物件陣列中的物件,而非參考中繼資料語彙基元。 |
DumpLog [-addr <addressOfStressLog>] [<Filename>] |
將記憶體中壓力記錄檔的內容寫入指定的檔案。 如果沒有指定名稱,此命令便會在目前的目錄中建立名為 StressLog.txt 的檔案。 記憶體中的壓力記錄可協助您診斷壓力失敗而不必使用鎖定或 I/O。 若要啟用壓力記錄檔,請在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework 底下設定下列登錄機碼: (DWORD) StressLog = 1 (DWORD) LogFacility = 0xffffffff (DWORD) StressLogSize = 65536 選擇性的 -addr 選項可讓您指定預設記錄檔以外的壓力記錄檔。 |
DumpMD <MethodDesc address> |
在指定的位址顯示 MethodDesc 結構的相關資訊。 您可以使用 IP2MD 命令,從 Managed 函式取得 MethodDesc 結構位址。 |
DumpMT [-MD] <MethodTable address> |
顯示在所指定位址之方法資料表的相關資訊。 指定 -MD 選項,便會顯示與物件一起定義之所有方法的清單。 每個 Managed 物件都包含一個方法資料表指標。 |
DumpMethodSig <sigaddr> <moduleaddr> |
顯示在所指定位址之 MethodSig 結構的相關資訊。 |
DumpModule [-mt] <Module address> |
顯示在所指定位址之模組的相關資訊。 -mt 選項會顯示定義在模組中的型別,以及由該模組所參考的型別。 您可以使用 DumpDomain 或 DumpAssembly 命令來擷取模組的位址。 |
DumpObj [-nofields] <object address> -或- DO <object address> |
顯示在所指定位址之物件的相關資訊。 DumpObj 命令會顯示欄位、EEClass 結構資訊、方法資料表,以及物件的大小。 您可以使用 DumpStackObjects 命令來擷取物件的位址。 請注意您可以對 CLASS 型別的欄位執行 DumpObj 命令,因為這些欄位也是物件。 -nofields 選項可防止物件的欄位顯示,這對像是 String 的物件非常有用。 |
DumpRuntimeTypes |
顯示記憶體回收行程堆積中的執行階段型別物件,並列出與其關聯的型別名稱和方法資料表。 |
DumpStack [-EE] [-n] [top stack [bottom stack]] |
顯示堆疊追蹤。
在 x86 和 x64 平台上,DumpStack 命令會建立詳細的堆疊追蹤。 在 IA-64 架構平台上,DumpStack 命令會模擬偵錯工具的 K 命令。 IA-64 架構平台會忽略 top 和 bottom 參數。 |
DumpSig <sigaddr> <moduleaddr> |
顯示在所指定位址之 Sig 結構的相關資訊。 |
DumpSigElem <sigaddr> <moduleaddr> |
顯示簽章物件的單一項目。 在大多數情況下,您都應該使用 DumpSig 來查看個別簽章物件。 不過,如果簽章已經以某種形式損毀,您可以使用 DumpSigElem 來讀取它的有效部分。 |
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 堆積中每個區段的範圍。 如果指標位於 -gc 所指定的區段範圍內,該指標就是物件指標。 |
EEStack [-short] [-EE] |
在處理序中的所有執行緒上執行 DumpStack 命令。 -EE 選項會直接傳遞到 DumpStack 命令。 -short 參數會將輸出限制到下列種類的執行緒:
|
EEVersion |
顯示 Common Language Runtime 版本。 |
EHInfo [<MethodDesc address>] [<Code address>] |
顯示所指定方法中的例外狀況 (Exception) 處理區塊。 這個命令會顯示子句區塊 (try 區塊) 和處理常式區塊 (catch 區塊) 的程式碼位址和位移。 |
FAQ |
顯示常見問題集。 |
FinalizeQueue [-detail] | [-allReady] [-short] |
顯示所有已註冊為結束的物件。
|
FindAppDomain <Object address> |
判斷在所指定位址之物件的應用程式定義域。 |
FindRoots -gen <N> | -gen any |<object address> |
讓偵錯工具在所指定層代的下一個集合上的偵錯項目內中斷。 只要中斷發生,就會立即重設效果。 若要在下一個集合上中斷,您必須重新發出命令。 -gen 或 -gen any 所造成的中斷發生之後,便會使用此命令的 <object address> 形式。 此時,偵錯項目處於正確的狀態,可讓 FindRoots 從目前的不適用層代識別出物件的根。 |
GCHandles [-perdomain] |
顯示處理序中記憶體回收行程控制代碼的統計資料。 -perdomain 選項會依據應用程式定義域來排列統計資料。 使用 GCHandles 命令,便可找出由記憶體回收行程控制代碼遺漏造成的記憶體遺漏 (Memory Leak)。 例如,當程式碼保留大型陣列時就會發生記憶體遺漏,其保留的原因是因為強式記憶體回收行程控制代碼依然指向該陣列,而捨棄控制代碼時卻未釋放陣列。 |
GCHandleLeaks |
在處理序中搜尋強式和 Pin 記憶體回收行程控制代碼之任何參考的記憶體,並顯示結果。 如果有找到控制代碼,GCHandleLeaks 命令便會顯示該參考的位址。 如果在記憶體中沒有找到任何控制代碼,這個命令便會顯示通知。 |
GCInfo <MethodDesc address><Code address> |
顯示指出註冊位置或堆疊位置在何時包含 Managed 物件的資料。 進行記憶體回收時,回收行程必須知道物件參考的位置,以便能夠用新的物件指標值來更新這些參考。 |
GCRoot [-nostacks] <Object address> |
顯示在所指定位址之物件參考 (或根目錄) 的相關資訊。 GCRoot 命令會在整個 Managed 堆積和控制碼表格中,檢查位於堆疊上之其他物件和控制代碼中的控制代碼。 然後,會在每個堆疊上搜尋物件的指標,並會搜尋完成項佇列。 這個命令不會判斷堆疊根目錄是否有效或是已遭捨棄。 使用 CLRStack 和 U 命令,便可分解區域或引數值所屬的框架,以便判斷該堆疊根目錄是否仍在使用中。 -nostacks 選項會將搜尋限制到記憶體回收行程控制代碼和可能執行的物件。 |
GCWhere <object address> |
顯示傳入之引數的記憶體回收堆積中的位置和大小。 當引數位於 Managed 堆積中,但不是有效的物件位址時,大小就會顯示為 0 (零)。 |
help [<command>] [faq] |
顯示當未指定任何參數時的所有可用命令,或是顯示所指定命令的詳細說明資訊。 faq 參數會顯示常見問題集的解答。 |
HeapStat [-inclUnrooted |-iu] |
顯示每個堆積的層代大小,以及每個堆積上每個層代中的總可用空間。 如果指定 -inclUnrooted 選項,報告就會包括來自於記憶體回收堆積,且不再為根目錄之 Managed 物件的相關資訊。 |
HistClear |
釋放 Hist 命令系列所使用的任何資源。 通常,您不需要明確地呼叫 HistClear,因為每個 HistInit 都會清除先前的資源。 |
HistInit |
初始化在偵錯項目中儲存之壓力記錄檔中的 SOS 結構。 |
HistObj <obj_address> |
會檢查所有壓力記錄檔重新配置記錄,並顯示可能會使位址被當做引數傳入之記憶體回收重新配置的鏈結。 |
HisttObjFind <obj_address> |
顯示參考位於指定位址之物件的所有記錄檔項目。 |
HistRoot <root> |
顯示與指定之根的提升和重新配置都相關的資訊。 根值可以透過記憶體回收,用來追蹤物件的移動。 |
IP2MD <Code address> |
顯示在已進行 JIT 編譯之程式碼中之指定位址的 MethodDesc 結構。 |
ListNearObj (lno) <obj_address> |
顯示在指定的位址之前與之後的物件。 此命令會在記憶體回收堆積中,尋找看來像是 Managed 物件之有效開頭的位址 (根據有效方法資料表),以及引數位址的後接物件。 |
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 結構。 指定的模組必須載入到處理序。 若要取得適當的型別名稱,請使用 Ildasm.exe (MSIL 反組譯工具) 瀏覽該模組。 您也可以將 * 當做模組名稱參數傳遞,以便搜尋所有已載入的 Managed 模組。 module name 參數也可以是模組的偵錯工具名稱,例如 mscorlib 或 image00400000。 這個命令支援 <module>!<type> 的 Windows 偵錯工具語法。 這個型別必須具有完整名稱。 |
ObjSize [<Object address>] | [-aggregate] [-stat] |
顯示所指定物件的大小。 如果未指定任何參數,ObjSize 命令會顯示在 Managed 執行緒上找到之所有物件的大小,並會顯示處理序中的所有記憶體回收行程控制代碼,以及這些控制代碼所指向之任何物件的總大小。 ObjSize 命令會包括父代 (Parent) 和其他所有子物件的大小。 -aggregate 選項可搭配使用 -stat 引數,以取得依然為根目錄之型別的詳細檢視。 藉由使用 !dumpheap -stat 和 !objsize -aggregate -stat,您可以判斷哪些物件不再是根目錄,以及診斷各種記憶體問題。 |
PrintException [-nested] [-lines] [<Exception object address>] -或- PE [-nested] [<Exception object address>] |
顯示並格式化在所指定位址且衍生自 Exception 類別之任何物件的欄位。 如果您沒有指定位址,PrintException 命令便會顯示目前執行緒上最近一次擲回的例外狀況。
您可以使用這個命令來格式化和檢視 _stackTrace 欄位,此欄位屬於二進位陣列。 |
ProcInfo [-env] [-time] [-mem] |
顯示處理序的環境變數、核心 (Kernel) CPU 時間,以及記憶體使用統計資料。 |
RCWCleanupList <RCWCleanupList address> |
顯示在所指定位址上正在等待清除之執行階段可呼叫包裝函式的清單。 |
SaveModule <Base address> <Filename> |
將在所指定位址上已載入記憶體的影像,寫入至指定的檔案。 |
SOSFlush |
清除內部 SOS 快取。 |
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 資料行、APT 資料行和 Exception 資料行,分別指出執行緒執行所在的應用程式定義域、COM Apartment 模式和執行緒中最近一次擲回的例外狀況。
|
ThreadState <狀態值欄位> |
顯示執行緒的狀態。 value 參數為 Threads 報告輸出中 State 欄位的值。 範例:
|
TraverseHeap [-xml] <filename> |
使用 CLR 分析工具可了解的格式,將堆積資訊寫入至指定的檔案。 -xml 選項會使 TraverseHeap 命令將檔案的格式設定為 XML。 您可以從 Microsoft 下載中心下載 CLR 分析工具。 |
U [-gcinfo] [-ehinfo] [-n] <MethodDesc address> | <Code address> |
顯示由方法之 MethodDesc 結構指標,或是由方法主體內之程式碼位址所指定 Managed 方法的標註反組譯碼。 U 命令會顯示從開始到結束的整個方法,以及將中繼資料語彙基元轉換成名稱的附註。
|
VerifyHeap |
檢查記憶體回收行程堆積是否有損毀徵兆,並顯示任何所發現的錯誤。 堆積損毀的原因可能是平台叫用 (Invoke) 架構不正確的呼叫。 |
VerifyObj <object address> |
檢查傳遞為引數的物件以找出損毀的症狀。 |
VMMap |
周遊虛擬位址空間,並顯示每個區域所套用的保護類型。 |
VMStat |
提供虛擬位址空間的摘要檢視,並依據套用至該記憶體的各種保護類型 (無限制、保留、認可、私用、對應、影像) 進行排列。 TOTAL 資料行會顯示 AVERAGE 資料行乘以 BLK COUNT 資料行的結果。 |
備註
將 SOS 偵錯擴充功能載入至 WinDbg.exe 偵錯工具 (此偵錯工具也可從 WDK 和開發人員工具網站取得),或是載入至 Visual Studio 以便使用。 您可以在 WinDgb.exe 或 Visual Studio 的 [即時運算] 視窗內執行命令。
SOS 偵錯擴充功能讓您能夠檢視在 Common Language Runtime 內執行之程式碼的相關資訊。 例如,您可以使用 SOS 偵錯擴充功能來顯示 Managed 堆積的相關資訊、尋找堆積損毀、顯示執行階段所使用的內部資料型別,並檢視在執行階段內執行之所有 Managed 程式碼的資訊。
載入 SOS 偵錯擴充功能
若要將 SOS 偵錯擴充功能載入至 WinDbg.exe 偵錯工具,請在此工具中執行下列命令:
.loadby sos clr
若要將 SOS 偵錯擴充功能載入至 Visual Studio,則請在進行偵錯時同時於 [即時運算] 視窗中執行下列命令:
.load SOS.dll
如果命令執行成功,它會在 [即時運算] 視窗中傳回下列訊息:
extension C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\sos.dll loaded
您必須先在方案的專案設定中啟用 Unmanaged 偵錯,才能開始載入 SOS 偵錯擴充功能。 對於部分語言來說,Unmanaged 偵錯預設為停用狀態。 某些平台並不允許同時對 Managed 和 Unmanaged 程式碼進行偵錯。
![]() |
---|
若要在 Visual Studio 中顯示 [即時運算] 視窗,請指向 [偵錯] 功能表上的 [視窗],然後按一下 [即時運算] 選項。您也可以按 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
請參閱
參考
Visual Studio 和 Windows SDK 命令提示字元
其他資源
變更記錄
日期 |
記錄 |
原因 |
---|---|---|
2011 年 4 月 |
加入使用 Visual Studio 和 Windows SDK 命令提示字元的相關資訊。 |
資訊加強。 |