SOS 偵錯延伸模組

SOS 偵錯延伸模組可讓您檢視於 .NET Core 執行階段內執行之程式碼 (在即時處理序和傾印上) 的資訊。 延伸模組會預先安裝 dotnet-dumpWindbg/dbg,且可以下載來搭配 LLDB 使用。 您可以使用 SOS 偵錯延伸模組進行下列動作:

  • 收集受控堆積的資訊。
  • 尋找堆積損毀。
  • 顯示執行階段所使用的內部資料類型。
  • 檢視執行階段內所執行所有受控程式碼的資訊。

語法

Windows

![command] [options]

Linux 與 macOS

sos [command] [options]

許多命令在 lldb 下都有別名或捷徑:

clrstack [options]

命令

下表的命令也可以在 Helpsoshelp 下取得。 您可以使用 soshelp <command> 取得個別命令說明。

Command 描述
bpmd [-nofuturemodule] [<module name><method name>] [-md<MethodDesc>] -list-clear<pending breakpoint number>-clearall 在所指定模組中的指定方法上建立中斷點。

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

您可以使用 -list-clear-clearall 選項來管理暫止中斷點的清單:

-list 選項會產生所有暫止中斷點的清單。 如果暫止中斷點具有非零的模組 ID,就是該特殊載入模組中函式的特定中斷點。 如果暫止中斷點具有零模組 ID,該中斷點就會套用至尚未載入的模組。

使用 -clear-clearall 選項可從清單中移除暫止中斷點。
CLRStack [-a] [-l] [-p] [-n] [-f] [-r] [-all] 僅提供 Managed 程式碼的堆疊追蹤。

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

-l 選項會顯示框架中區域變數的相關資訊。 SOS 偵錯延伸模組無法擷取區域名稱,因此區域名稱的輸出格式為 <本地位置>=<值>。

-a 選項是 -l-p 組合的捷徑。

-n 選項會停用原始程式檔名稱和行號的顯示。 如果偵錯工具有指定 SYMOPT_LOAD_LINES 選項,SOS 將會查詢每個 Managed 框架的符號,而且如果成功,就會顯示對應的原始程式檔名稱和行號。 指定 -n (沒有行號) 參數即可停用這種行為。

-f 選項 (完整模式) 會顯示與受控框架的原生框架混合,以及受控框架的組件名稱和函式位移。 當搭配 dotnet-dump 使用時,此選項不會顯示原生框架。

-r 選項會傾印每個堆疊框架的暫存器。

-all 選項會傾印所有受控執行緒的堆疊。
COMState 列出每個執行緒和 Context 指標的 COM Apartment Model (如果有)。 只有 Windows 支援此命令。
DumpArray [-start<startIndex>] [-length<length>] [-details] [-nofields] <array object address>

-或-

DA [-start<startIndex>] [-length<length>] [-details] [-nofields] array object address>
檢查陣列物件的元素。

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

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

-details 選項會使用 DumpObjDumpVC 格式來顯示項目的詳細資料。

-nofields 選項會防止陣列顯示。 這個選項只有在指定 -details 選項時才能使用。
DumpAsync (dumpasync) [-mt<MethodTable address>] [-type<partial type name>] [-waiting] [-roots] DumpAsync 會周遊記憶體回收堆積,並尋找代表非同步狀態機器的物件,其會在非同步方法的狀態傳送至堆積時建立。 此命令會辨識定義為 async voidasync Taskasync Task<T>async ValueTaskasync ValueTask<T> 的非同步狀態機器。

輸出包含所找到每個非同步狀態機器物件的詳細資料區塊。 這些詳細資料包括:
- 非同步狀態機器物件的類型行,包括其 MethodTable 位址、物件位址、大小,以及類型名稱。
- 物件中包含的狀態機器類型名稱行。
- 狀態機器上每個欄位的清單。
- 如果已註冊一或多個狀態機器物件,則為此狀態機器物件的接續行。
- 此非同步狀態機器物件的已探索 GC 根目錄。
DumpAssembly<assembly address> 顯示關於組件的資訊。

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

您可以使用 DumpDomain 命令取得組件位址。
DumpClass<EEClass address> 顯示與某個類型關聯之 EEClass 結構的資訊。

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

使用 DumpMTDumpObjName2EEToken2EE 命令,以取得 EEClass 結構位址。
DumpDomain [<domain address>] 列舉載入於所指定 Assembly 物件位址內的每個 AppDomain 物件。 當不使用參數進行呼叫時,DumpDomain 命令便會列出處理序中的所有 AppDomain 物件。 因為 .NET Core 只有一個 AppDomain,所以 DumpDomain 只會傳回一個物件。
DumpHeap [-stat] [-strings] [-short] [-min<size>] [-max<size>] [-thinlock] [-startAtLowerBound] [-mt<MethodTable address>] [-type<partial type name>] [start [end]] 顯示記憶體回收堆積的資訊,以及關於物件的回收統計資料。

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

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

-strings 選項會將輸出限制為統計字串值摘要。

-short 選項會將輸出限制為每個物件的位址。 這可讓您輕鬆地將輸出從命令由管道送到另一個偵錯工具命令以達成自動化。

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

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

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

-startAtLowerBound 選項會強制堆積查核從所提供之位址範圍的下限開始。 在規劃階段期間,因為物件正在移動,通常都無法查核堆積。 這個選項會強制 DumpHeap 在指定的下限開始其查核。 您必須提供有效物件的位址,做為讓此選項運作的下限。 您可以顯示位於錯誤物件之位址的記憶體,以手動方式找出下一個方法資料表。 如果記憶體回收目前位於 memcopy 的呼叫中,您也可以將大小加到起始位址 (以參數的形式提供),以尋找下一個物件的位址。

-mt 選項只會列出會對應至所指定 MethodTable 結構中的那些物件。

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

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

end 參數會在指定的位址停止列出。
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 物件都包含一個方法資料表指標。
DumpModule [-mt] <Module address> 顯示在所指定位址之模組的相關資訊。 -mt 選項會顯示定義在模組中的類型,以及由該模組所參考的類型。

您可以使用 DumpDomainDumpAssembly 命令來擷取模組的位址。
DumpObj [-nofields] <object address>

-或-

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

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

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

-nofields 選項可防止物件的欄位顯示,這對像是 String 的物件非常有用。
DumpRuntimeTypes 顯示記憶體回收行程堆積中的執行階段類型物件,並列出與其關聯的類型名稱和方法資料表。
DumpStack [-EE] [-n] [topstack [bottomstack]] 顯示堆疊追蹤。

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

-n 選項會停用原始程式檔名稱和行號的顯示。 如果偵錯工具有指定 SYMOPT_LOAD_LINES 選項,SOS 將會查詢每個 Managed 框架的符號,而且如果成功,就會顯示對應的原始程式檔名稱和行號。 指定 -n (沒有行號) 參數即可停用這種行為。

DumpSig<sigaddr><moduleaddr> 在指定的位址顯示 Sig 結構的相關資訊。
DumpSigElem<sigaddr><moduleaddr> 顯示簽章物件的單一項目。 在大多數情況下,您都應該使用 DumpSig 來查看個別簽章物件。 不過,如果簽章已經以某種形式損毀,您可以使用 DumpSigElem 來讀取它的有效部分。
DumpStackObjects [-verify] [topstack [bottomstack]]

-或-

DSO [-verify] [topstack [bottomstack]]
顯示可在目前堆疊界限內找到的所有 Managed 物件。

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

使用 DumpStackObject 命令搭配堆疊追蹤命令 (例如 K (windbg) 或 bt (lldb) 以及 clrstack 命令),即可判斷區域變數和參數的值。
DumpVC<MethodTable address><Address> 顯示在所指定位址之實值類別欄位的相關資訊。

MethodTable 參數可讓 DumpVC 命令正確地解譯欄位。 實值類別並未以方法資料表做為其第一個欄位。
EEHeap [-gc] [-loader] 顯示由內部執行階段資料結構取用的處理序記憶體資訊。

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

記憶體回收行程的資訊會列出 Managed 堆積中每個區段的範圍。 如果指標位於 -gc 所指定的區段範圍內,該指標就是物件指標。
EEStack [-short] [-EE] 在處理序中的所有執行緒上執行 DumpStack 命令。

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

具有鎖定的執行緒。

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

目前在 Managed 程式碼中的執行緒。
EHInfo [<MethodDesc address>] [<Code address>] 顯示所指定方法中的例外狀況處理區塊。 這個命令會顯示子句區塊 (try 區塊) 和處理常式區塊 (catch 區塊) 的程式碼位址和位移。
常見問題集 顯示常見問題集。 dotnet-dump 中不支援。
FinalizeQueue [-detail] | [-allReady] [-short] 顯示所有已註冊為完成項的物件。

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

-allReady 選項會顯示已準備好進行最終處理的所有物件,無論它們已經由記憶體回收這樣標記,或是將由下一個記憶體回收所標記,都會包括在內。 在「準備最終處理」清單中的物件,也就是不再是根目錄的可最終處理物件。 這個選項可能非常昂貴,因為它會驗證可最終處理佇列中的所有物件是否依然為根目錄。

-short 選項會將輸出限制為每個物件的位址。 如果搭配使用它與 -allReady,它就會列舉具有完成項且不再為根目錄的所有物件。 如果單獨使用,它就會在可進行最終處理和「準備最終處理」的佇列中列出所有物件。
FindAppDomain<Object address> 判斷在所指定位址之物件的應用程式定義域。
FindRoots-gen<N> | -gen any |<object address> 讓偵錯工具在所指定層代的下一個集合上的偵錯項目內中斷。 只要中斷發生,就會立即重設效果。 若要在下一個集合上中斷,您必須重新發出命令。 在發生了 -gen-gen any 所導致的中斷之後,會使用這個命令的 <object address> 形式。 此時,偵錯項目處於正確的狀態,可讓 FindRoots 從目前的不適用層代識別出物件的根。 僅 Windows 支援。
GCHandles [-perdomain] 顯示處理序中記憶體回收行程控制代碼的統計資料。

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

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

僅 Windows 支援。
GCHandleLeaks 在處理序中搜尋強式和 Pin 記憶體回收行程控制代碼之任何參考的記憶體,並顯示結果。 如果有找到控制代碼,GCHandleLeaks 命令便會顯示該參考的位址。 如果在記憶體中沒有找到任何控制代碼,這個命令便會顯示通知。 僅 Windows 支援。
GCInfo<MethodDesc address><Code address> 顯示指出註冊位置或堆疊位置在何時包含 Managed 物件的資料。 進行記憶體回收時,回收行程必須知道物件參考的位置,以便能夠用新的物件指標值來更新這些參考。
GCRoot [-nostacks] [-all] <Object address> 顯示在所指定位址之物件參考 (或根目錄) 的相關資訊。

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

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

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

-all 選項會強制顯示所有根目錄,而不只是唯一根目錄。
GCWhere<object address> 顯示傳入之引數的記憶體回收堆積中的位置和大小。 當引數位於 Managed 堆積中,但不是有效的物件位址時,大小就會顯示為 0 (零)。
Help (soshelp) [<command>] [faq] 顯示當未指定任何參數時的所有可用命令,或是顯示所指定命令的詳細說明資訊。

faq 參數會顯示常見問題集的解答。
HeapStat [-inclUnrooted | -iu] 顯示每個堆積的層代大小,以及每個堆積上每個層代中的總可用空間。 如果指定 -lines 選項,報告就會包括來自於記憶體回收堆積,且不再為根目錄之 Managed 物件的相關資訊。 僅 Windows 支援。
HistClear 釋放 Hist 命令系列所使用的任何資源。

通常,您不需要明確地呼叫 HistClear,因為每個 HistInit 都會清除先前的資源。
HistInit 初始化在偵錯項目中儲存之壓力記錄檔中的 SOS 結構。
HistObj<obj_address> 會檢查所有壓力記錄檔重新配置記錄,並顯示可能會使位址被當做引數傳入之記憶體回收重新配置的鏈結。
HistObjFind<obj_address> 顯示參考位於指定位址之物件的所有記錄檔項目。
HistRoot<root> 顯示與指定之根的提升和重新配置都相關的資訊。

根值可以透過記憶體回收,用來追蹤物件的移動。
IP2MD (ip2md) <Code address> 顯示在已進行 JIT 編譯之程式碼中之指定位址的 MethodDesc 結構。
ListNearObj (lno) <obj_address> 顯示在指定的位址之前與之後的物件。 此命令會在記憶體回收堆積中,尋找看來像是 Managed 物件之有效開頭的位址 (根據有效方法資料表),以及引數位址的後接物件。 僅 Windows 支援。
MinidumpMode [0] [1] 防止在使用小型傾印時執行不安全的命令。

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

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

僅 Windbg 支援。
Name2EE (name2ee) <module name><type or method name>

-或-

Name2EE<module name>!<type or method name>
顯示所指定模組中之指定類型或方法的 MethodTable 結構和 EEClass 結構。

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

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

這個命令支援 <module>!<type> 的 Windows 偵錯工具語法。 這個類型必須具有完整名稱。
ObjSize [<Object address>] | [-aggregate] [-stat] 顯示所指定物件的大小。 如果未指定任何參數,ObjSize 命令會顯示在 Managed 執行緒上找到之所有物件的大小,並會顯示處理序中的所有記憶體回收行程控制代碼,以及這些控制代碼所指向之任何物件的總大小。 ObjSize 命令會包括父代和其他所有子物件的大小。

-aggregate 選項可搭配使用 -stat 引數,以取得依然為根目錄之類型的詳細檢視。 藉由使用 !dumpheap -stat!objsize -aggregate -stat,您可以判斷哪些物件不再是根目錄,以及診斷各種記憶體問題。

僅 Windows 支援。
PrintException [-nested] [-lines] [<Exception object address>]

-或-

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

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

-lines 選項會顯示來源資訊 (如果存在)。

您可以使用這個命令來格式化和檢視 _stackTrace 欄位,此欄位屬於二進位陣列。
ProcInfo [-env] [-time] [-mem] 顯示處理序的環境變數、核心 CPU 時間,以及記憶體使用統計資料。 僅 Windbg 支援。
RCWCleanupList<RCWCleanupList address> 顯示在所指定位址上正在等待清除之執行階段可呼叫包裝函式的清單。 僅 Windbg 支援。
SaveModule<Base address><Filename> 將在所指定位址上已載入記憶體的影像,寫入至指定的檔案。 僅 Windbg 支援。
SetHostRuntime [<runtime-directory>] 此命令設定 .NET Core 執行階段的路徑,用於裝載受控程式碼,該程式碼可在偵錯工具 (lldb) 中作為 SOS 的一部分執行。 執行階段至少必須是 2.1.0 版或更新版本。 如果目錄中有空格,則必須以單引號 (') 括住。

一般而言,SOS 會嘗試尋找已安裝的 .NET Core 執行階段以自動執行其受控程式碼,但如果失敗,則可以使用此命令。 預設值是使用相同的受偵錯執行階段 (libcoreclr)。 如果受偵錯的預設執行階段無法執行 SOS 程式碼,或版本小於 2.1.0,請使用此命令。

如果您在執行 SOS 命令時收到下列錯誤訊息,請使用此命令將路徑設定為 .NET Core 執行階段的 2.1.0 版或更新版本。

(lldb) clrstack
Error: Fail to initialize CoreCLR 80004005 ClrStack failed

(lldb) sethostruntime /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.6

您可以使用命令殼層中的 "dotnet --info" 來尋找已安裝之 .NET Core 執行階段的路徑。
SetSymbolServer [-ms] [-disable] [-log] [-loadsymbols] [-cache<cache-path>] [-directory<search-directory>] [-sympath<windows-symbol-path>] [<symbol-server-URL>] 啟用符號伺服器下載支援。

-ms 選項可讓您從公用 Microsoft 符號伺服器進行下載。

-disable 選項會開啟符號下載支援。

-cache<cache-path> 選項會指定符號快取目錄。 如果未指定,則預設值為 $HOME/.dotnet/symbolcache。

-directory 選項會新增路徑來搜尋符號。 路徑可以有多個。

-temp 選項會以 Windows 符號路徑格式來新增伺服器、快取和目錄路徑。

-log 選項會啟用符號下載記錄。

-loadsymbols 選項會嘗試下載執行階段的原生 .NET Core 符號。 受 lldb 和 dotnet-dump 支援。
SOSFlush 清除內部 SOS 快取。
SOSStatus [-reset] 顯示內部 SOS 狀態或重設內部快取狀態。
StopOnException [-derived] [-create | -create2] <Exception><Pseudo-register number> 導致偵錯工具會在擲回所指定例外狀況時停止,但是在擲回其他例外狀況時會繼續執行。

-derived 選項會攔截所指定的例外狀況,以及從所指定例外狀況衍生的每一個例外狀況。

僅 Windbg 支援。
SyncBlk [-all | <syncblk number>] 顯示所指定 SyncBlock 結構,或是所有的 SyncBlock 結構。 如果您沒有傳遞任何引數,SyncBlk 命令便會顯示屬於某執行緒擁有之物件的對應 SyncBlock 結構。

SyncBlock 結構是專門放置並非每一個物件都要建立之額外資訊的容器。 其中可以包含 COM Interop 資料、雜湊碼,以及安全執行緒作業的鎖定資訊。
ThreadPool 顯示 Managed 執行緒集區的相關資訊,其中包括佇列中工作要求的數目、完成連接埠執行緒的數目,以及計時器的數目。
Threads (clrthreads) [-live] [-special] 顯示處理序中的所有 Managed 執行緒。

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

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

-special 選項會顯示由 CLR 建立的所有特殊執行緒。 特殊執行緒包括記憶體回收執行緒 (在並行和伺服器記憶體回收中)、偵錯工具 Helper 執行緒、完成項執行緒、AppDomain 卸載執行緒,以及執行緒集區計時器執行緒。
ThreadState <State value field> 顯示執行緒的狀態。 value 參數為 Threads 報告輸出中 State 欄位的值。
Token2EE<module name><token> 將所指定模組中的已指定中繼資料語彙基元轉變成 MethodTable 結構或 MethodDesc 結構。

您可以將 * 當做模組名稱參數傳遞,便可了解該語彙基元對應至每一個載入之 Managed 模組中的哪個項目。 您也可以傳遞模組的偵錯工具名稱,例如 mscorlibimage00400000
U [-gcinfo] [-ehinfo] [-n] <MethodDesc address> | <Code address> 顯示由方法之 MethodDesc 結構指標,或是由方法主體內之程式碼位址所指定 Managed 方法的標註反組譯碼。 U 命令會顯示從開始到結束的整個方法,以及將中繼資料語彙基元轉換成名稱的註釋。

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

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

-n 選項會停用原始程式檔名稱和行號的顯示。 如果偵錯工具有指定 SYMOPT_LOAD_LINES 選項,SOS 就會查詢每個 Managed 框架的符號,而且如果成功,就會顯示對應的原始程式檔名稱和行號。 您可以指定 -n 選項以停用這種行為。
VerifyHeap 檢查記憶體回收行程堆積是否有損毀徵兆,並顯示任何所發現的錯誤。

堆積損毀的原因可能是平台叫用架構不正確的呼叫。
VerifyObj<object address> 檢查傳遞為引數的物件以找出損毀的症狀。 僅 Windows 支援。
VMMap 周遊虛擬位址空間,並顯示每個區域所套用的保護類型。 僅 Windbg 支援。
VMStat 提供虛擬位址空間的摘要檢視,並依據套用至該記憶體的各種保護類型 (無限制、保留、認可、私用、對應、影像) 進行排列。 TOTAL 資料行會顯示 AVERAGE 資料行乘以 BLK COUNT 資料行的結果。 僅 Windbg 支援。

Dotnet-Dump

如需搭配 dotnet-dump analyze 的可用 SOS 命令清單,請參閱 dotnet-dump

Windows 偵錯工具

您也可以將 SOS 偵錯延伸模組載入 WinDbg/dbg 偵錯工具,並在 Windows 偵錯工具內執行命令,以使用 SOS 偵錯延伸模組。 SOS 命令可用於即時處理序或傾印。

每當受偵錯的處理序包含 .NET Core 執行階段 (coreclr.dll 或 libcoreclr.so) 時,Windbg 應該會自動載入 SOS 延伸模組。

LLDB 偵錯工具

如需設定適用於 LLDB 之 SOS 的指示,請參閱 dotnet-sos。 SOS 命令可用於即時處理序或傾印。

根據預設,您可以輸入下列命令來取得所有 SOS 命令:sos [command_name] 。 不過,因為一般命令已使用別名,所以您不需要 sos 前置詞:

Command 函式
analyzeoom 顯示在 GC 堆積的配置要求上,最後發生之 OOM 的資訊。
bpmd 在所指定模組中的指定受控方法上建立中斷點。
clrmodules 列出處理序中的受控模組。
clrstack 僅提供 Managed 程式碼的堆疊追蹤。
clrthreads 列出正在執行的受控執行緒。
clru 顯示受控方法的已加註釋反組譯碼。
dbgout 啟用/停用 (-off) 內部 SOS 記錄。
dso 顯示可在目前堆疊界限內找到的所有 Managed 物件。
dumpalc 顯示指定物件要載入其中的可收集 AssemblyLoadContext 其詳細資料。
dumparray 顯示受控陣列的詳細資料。
dumpasync 顯示記憶體回收堆積上非同步狀態機器的資訊。
dumpassembly 顯示組件的詳細資料。
dumpclass 顯示指定位址的 EEClass 結構資訊。
dumpconcurrentdictionary 顯示並行字典內容。
dumpconcurrentqueue 顯示並行佇列內容。
dumpdelegate 顯示委派的資訊。
dumpdomain 顯示所有 AppDomain 中所有組件或指定組件的資訊。
dumpgcdata 顯示 GC 資料的資訊。
dumpgen 顯示指定世代的堆積內容。
dumpheap 顯示記憶體回收堆積的資訊,以及物件的收集統計資料。
dumpil 顯示與受控方法建立關聯的 Microsoft 中繼語言 (MSIL)。
dumplog 將記憶體中壓力記錄檔的內容寫入指定的檔案。
dumpmd 顯示指定位址的 MethodDesc 結構資訊。
dumpmodule 顯示指定位址的模組資訊。
dumpmt 顯示指定位址的方法資料表資訊。
dumpobj 顯示指定位址的物件資訊。
dumpruntimetypes 尋找 GC 堆積中的所有 System.RuntimeType 物件,並列印其參考的類型名稱和 MethodTable。
dumpsig 傾印 <sigaddr> <moduleaddr> 所指定方法或欄位的特徵標記。
dumpsigelem 傾印特徵標記物件的單一元素。
dumpstack 顯示原生和受控堆疊追蹤。
dumpstackobjects 顯示可在目前堆疊界限內找到的所有 Managed 物件。
dumpvc 顯示實值類別欄位的資訊。
eeheap 顯示內部執行階段資料結構取用的處理序記憶體資訊。
eestack 在處理序的所有執行緒上執行 dumpstack
eeversion 顯示執行階段和 SOS 版本的資訊。
ehinfo 顯示 JIT 方法中的例外狀況處理區塊。
finalizequeue 顯示所有已註冊為完成項的物件。
findappdomain 嘗試解析 GC 物件的 AppDomain。
findroots 尋找並顯示跨 GC 收集的物件根目錄。
gchandles 顯示處理序中記憶體回收行程控制代碼的統計資料。
gcheapstat 顯示記憶體回收行程的相關統計資料。
gcinfo 顯示方法的 JIT GC 編碼。
gcroot 顯示指定位址的物件參考 (或根目錄) 資訊。
gcwhere 顯示在指定位址之 GC 堆積中的位置。
histclear 釋出 Hist 命令系列所使用的任何資源。
histinit 初始化在偵錯項目中儲存之壓力記錄檔中的 SOS 結構。
histobj 會檢查所有壓力記錄檔重新配置記錄,並顯示可能會使位址被當做引數傳入之記憶體回收重新配置的鏈結。
histobjfind 顯示參考指定位址之物件的所有記錄檔項目。
histroot 顯示與指定之根的提升和重新配置都相關的資訊。
histstats 顯示壓力記錄統計資料。
ip2md 顯示在已進行 JIT 編譯之程式碼中之指定位址的 MethodDesc 結構。
listnearobj 顯示指定位址之前與之後的物件。
loadsymbols 載入 .NET Core 原生模組符號。
logging 啟用/停用內部 SOS 記錄。
name2ee 顯示指定模組中所指定類型或方法的 MethodTableEEClass 結構。
objsize 顯示所指定物件的大小。
parallelstacks 顯示與 Visual Studio [平行堆疊] 面板類似的合併執行緒堆疊。
pathto 顯示從 <root><target> 的 GC 路徑。
pe 顯示並格式化在所指定位址且衍生自 Exception 類別之任何物件的欄位。
printexception 顯示並格式化在所指定位址且衍生自 Exception 類別之任何物件的欄位。
runtimes 列出目標中的執行階段,或變更預設執行階段。
stoponcatch 下次在執行期間攔截到受控例外狀況時,目標處理序將會中斷。
setclrpath 設定載入 coreclr dac/dbi 檔案的路徑。 setclrpath <path>.
sethostruntime 設定或顯示用於在 SOS 中執行受控程式碼的 .NET Core 執行階段目錄。
setsymbolserver 啟用符號伺服器支援。
setsostid 設定目前的 OS tid/thread 索引,而不是使用 lldb 提供的索引。 setsostid <tid> <index>.
sos 執行各種 coreclr 偵錯命令。 使用 sos <command-name> <args> 語法。 如需詳細資訊,請參閱 'soshelp'。
soshelp 顯示當未指定任何參數時的所有可用命令,或顯示所指定命令的詳細說明資訊:soshelp <command>
syncblk 顯示 SyncBlock 預留位置資訊。
taskstate 以人類可讀的格式顯示工作狀態。
threadpool 顯示執行階段執行緒集區的資訊。
threadpoolqueue 顯示排入佇列的執行緒集區工作項目。
threadstate 美化顯示執行緒狀態的意義。
timerinfo 顯示執行中計時器的資訊。
token2ee 顯示指定權杖和模組的 MethodTable 結構和 MethodDesc 結構。
traverseheap 以 CLR 分析工具可了解的格式,將堆積資訊寫入檔案。
verifyheap 檢查 GC 堆積是否有損毀的跡象。
verifyobj 檢查傳遞為引數的物件以找出損毀的症狀。

Windbg/cdb 範例使用方式

Command 描述
!dumparray -start 2 -length 5 -details 00ad28d0 顯示 00ad28d0 位址的陣列內容。 顯示會從第二個元素開始,然後連續顯示五個元素。
!dumpassembly 1ca248 顯示 1ca248 位址的組件內容。
!dumpheap 顯示記憶體回收行程堆積的資訊。
!DumpLog 會將記憶體中壓力記錄檔的內容,寫入目前目錄中名為 StressLog.txt 的預設檔案。
!dumpmd 902f40 顯示 902f40 位址上的 MethodDesc 結構。
!dumpmodule 1caa50 顯示 1caa50 位址的模組資訊。
!DumpObj a79d40 顯示 a79d40 位址的物件資訊。
!DumpVC 0090320c 00a79d9c 使用 0090320c 位址的方法資料表,以顯示 00a79d9c 位址的實值類別欄位。
!eeheap -gc 顯示記憶體回收行程所使用的處理序記憶體。
!finalizequeue 顯示排程進行最終處理的所有物件。
!findappdomain 00a79d98 判斷 00a79d98 位址上物件的應用程式定義域。
!gcinfo 5b68dbb8 顯示目前處理序中的所有記憶體回收行程控制碼。
!name2ee unittest.exe MainClass.Main 顯示 unittest.exe 模組中 MainClass 類別內 Main 方法的 MethodTableEEClass 結構。
!token2ee unittest.exe 02000003 顯示 unittest.exe 模組中 02000003 位址上的中繼資料權杖資訊。

LLDB 範例使用方式

Command 描述
dumparray -start 2 -length 5 -details 00ad28d0 顯示 00ad28d0 位址的陣列內容。 顯示會從第二個元素開始,然後連續顯示五個元素。
dumpassembly 1ca248 顯示 1ca248 位址的組件內容。
dumpheap 顯示記憶體回收行程堆積的資訊。
dumplog 會將記憶體中壓力記錄檔的內容,寫入目前目錄中名為 StressLog.txt 的預設檔案。
dumpmd 902f40 顯示 902f40 位址上的 MethodDesc 結構。
dumpmodule 1caa50 顯示 1caa50 位址的模組資訊。
dumpobj a79d40 顯示 a79d40 位址的物件資訊。
dumpvc 0090320c 00a79d9c 使用 0090320c 位址的方法資料表,以顯示 00a79d9c 位址的實值類別欄位。
eeheap -gc 顯示記憶體回收行程所使用的處理序記憶體。
findappdomain 00a79d98 判斷 00a79d98 位址上物件的應用程式定義域。
gcinfo 5b68dbb8 顯示目前處理序中的所有記憶體回收行程控制碼。
name2ee unittest.exe MainClass.Main 顯示 unittest.exe 模組中 MainClass 類別內 Main 方法的 MethodTableEEClass 結構。
token2ee unittest.exe 02000003 顯示 unittest.exe 模組中 02000003 位址上的中繼資料權杖資訊。
clrthreads 顯示受控執行緒。

另請參閱