共用方式為


使用 Windows 調試程式偵錯 Managed 程式代碼

您可以使用 Windows 調試程式(WinDbg、CDB 和 NTSD)來偵錯包含 Managed 程式代碼的目標應用程式。 若要對 Managed 程式代碼進行偵錯, 請使用 。SOS 偵錯延伸模組 (sos.dll) 和資料存取元件 (mscordacwks.dll) 與 CLR 執行時間結合。

Windows 調試程式,例如 WinDbg 與 Visual Studio 調試程式不同。 如需 Windows 調試程式與 Visual Studio 調試程式之間的差異相關信息,請參閱 Windows 的偵錯工具。

本文提供使用 Windows 調試程式(WinDbg、CDB、NTSD)偵錯 Managed 程式代碼的指示,包括 .NET Framework、.NET Core 和 .NET 5+ 應用程式。

注意

偵錯 .NET Framework、.NET Core 和 .NET 5+ 應用程式時,請確定您使用的是最新版本的 Windows 調試程式工具。 此外,請考慮使用Visual Studio或Visual Studio Code進行更整合的偵錯體驗。 WinDbg 比較複雜、需要更多工作來設定,而且通常會在需要額外的低層級資訊時使用。

Managed 程式代碼簡介

Managed 程式代碼會與 Microsoft .NET Common Language Runtime (CLR) 一起執行。 在 Managed 程式代碼應用程式中,編譯程式產生的二進位程式代碼位於與平台無關的中繼語言 (MSIL) Microsoft。

執行 Managed 程式代碼時,運行時間會產生平臺專屬的機器碼。 從 MSIL 產生機器碼的程式稱為 Just-In-Time (JIT) 編譯。 在 JIT 編譯程式針對特定方法編譯 MSIL 之後,方法的機器碼會保留在記憶體中。 每當稍後呼叫此方法時,原生程序代碼就會執行,而且 JIT 編譯程式不需要參與。

您可以使用由各種軟體產生者所製造的數個編譯程式來建置 Managed 程式代碼。 特別是,Microsoft Visual Studio 可以從數種不同的語言建置 Managed 程式代碼,包括 C#、Visual Basic、JScript,以及使用 Managed 擴充功能C++。

每次更新 .NET Framework 時,CLR 都不會更新。 例如,.NET Framework 2.0、3.0 和 3.5 版都使用 CLR 2.0 版。 如需 .NET 版本的其他資訊,請參閱 .NET Framework 版本和相依性。 如需決定計算機上 .NET 版本的資訊,請參閱 判斷已安裝哪些 .NET Framework 版本。

偵錯 Managed 程式碼

若要使用 對 Managed 程式代碼進行偵錯!SOS 偵錯延伸模組,調試程式必須載入各種元件。 這!SOS 偵錯延伸模組和用於 .NET Core 和原始 .NET Framework 之不同的必要元件。 其中一項是使用數據存取元件 (DAC) (mscordacwks.dll)。

.NET SDK 提供有助於偵錯 .NET 應用程式的工具。 如需詳細資訊,請參閱 什麼是 .NET SDK?

.NET Core

針對 .NET Core,有一個 dotnet CLI 工具可用來安裝sos.dll。 如需詳細資訊,請參閱 SOS 安裝程式(dotnet-sos)。

原始 .NET Framework。

取得 SOS 偵錯擴充功能 (sos.dll)

SOS 偵錯延伸模組 (sos.dll) 檔案不包含在所有版本的 Windows 偵錯工具中。 如果sos.dll無法使用,請參閱在 Windows 上安裝 SOS。

載入 SOS 偵錯延伸模組 (sos.dll)

若要偵錯 .NET Core 和 .NET 5+ 應用程式,您需要載入適當的 SOS 偵錯擴充功能版本。

例如,至的 版本!隨附於調試程式的SOS,並包含在目前的延伸模組搜尋路徑中, 則會使用 .load 命令。

0:000> .load sos.dll

若要確認 SOS 偵錯延伸模組已正確載入,請使用 .chain 命令並解譯延伸模組 DLL 鏈結

...
Extension DLL chain:
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\SOS.dll: image 4.8.9275.0, API 1.0.0, built Wed Aug 28 14:43:27 2024
        [path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\SOS.dll]
    C:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App\8.0.8\coreclr.dll: image 8,0,824,36612 @Commit: 08338fcaa5c9b9a8190abb99222fed12aaba956c, built Tue Jul 16 11:10:19 2024
        [path: C:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App\8.0.8\coreclr.dll]

如果調試程式的版本不包含sos.dll,您可能需要指定SOS.dll檔案的完整路徑。 您通常可以在 .NET Core 或 .NET Framework 安裝的運行時間目錄中找到SOS.dll檔案。

0:000> .load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll

載入特定版本的 sos.dll

載入sos.dll可能會很複雜,因為相依於其他 DLL,sos.dll用來與 .NET 通訊。 此外,所需的 DLL 版本取決於要偵錯之應用程式的 .NET 版本,而且計算機上可能會存在多個 .NET 版本。

載入正確版本的相依 DLL 的其中一個策略是要求調試程式在使用 sx、sxd、sxe、sxi、sxn、sxr、sx- (Set Exceptions)[.時中斷調試程式。/debuggercmds/sx--sxd--sxe--sxi--sxn--sxr--sx---set-exceptions-.md] 命令。 一旦您附加至目標 .NET 應用程式,此命令會在第一次中斷之後使用。

0:000> sxe CLRN

接下來繼續執行,並等候中斷發生。

0:000> g

當中斷發生時,請停用 clr 通知中斷,因為我們知道已載入 clr.dll (或 coreclr.dll)。

0:000> sxd CLRN

在此內容中使用調試程式,使用 .loadby 從相同的「附近」目錄位置載入 !sos。

0:000> .loadby sos clr

另一個選項是使用 .cordll(控制 CLR 偵錯) 藉由提供目標架構位置的路徑來載入 CLR 偵錯 DLL。

0:000> .cordll -ve -u -lp C:\Windows\Microsoft.NET\Framework\v4.0.30319\
CLRDLL: Loaded DLL C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscordacwks.dll
Automatically loaded SOS Extension
CLR DLL status: Loaded DLL C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscordacwks.dll

使用SOS偵錯擴充功能

若要確認 SOS 偵錯延伸模組已正確載入,請輸入 .chain 命令。

0:000> .chain
Extension DLL search Path:
    C:\Program Files\Debugging Tools for Windows (x64);...
Extension DLL chain:
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\SOS.dll: image 4.8.9275.0, API 1.0.0, built Wed Aug 28 14:43:27 2024
        [path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\SOS.dll]
...

.NET 符號檔

符號檔對於偵錯至關重要。 針對 .NET Framework、.NET Core 和 .NET 5+ 應用程式,您可以從Microsoft的公用符號伺服器擷取必要的符號檔。 使用下列命令來設定符號路徑和響應符號載入。

.symfix

!sym noisy

.reload

測試 .NET Core !sos 擴充功能

若要測試 SOS 偵錯延伸模組,請輸入 !sos.help

0:000> !sos.help
-------------------------------------------------------------------------------
SOS is a debugger extension DLL designed to aid in the debugging of managed
programs. Functions are listed by category, then roughly in order of
importance. Shortcut names for popular functions are listed in parenthesis.
Type "!help <functionname>" for detailed info on that function. 

Object Inspection                  Examining code and stacks
-----------------------------      -----------------------------
DumpObj (do)                       Threads
DumpArray (da)                     ThreadState
DumpStackObjects (dso)             IP2MD
DumpHeap                           U
DumpVC                             DumpStack
GCRoot                             EEStack
ObjSize                            CLRStack
FinalizeQueue                      GCInfo
PrintException (pe)                EHInfo
TraverseHeap                       BPMD 
                                   COMState

然後嘗試 SOS 偵錯延伸模組所提供的其中一個命令。 例如,您可以嘗試 !sos。DumpDomain!sos。.NET Core SOS 偵錯延伸模組所提供的線程命令。

0:000> !sos.DumpDomain
--------------------------------------
System Domain:      7565d980
LowFrequencyHeap:   7565dca4
HighFrequencyHeap:  7565dcf0
StubHeap:           7565dd3c
Stage:              OPEN
Name:               None
--------------------------------------
Shared Domain:      7565d620
LowFrequencyHeap:   7565dca4
HighFrequencyHeap:  7565dcf0
StubHeap:           7565dd3c
Stage:              OPEN
Name:               None
Assembly:           00fa5e78 [C:\WINDOWS\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll]
ClassLoader:        00fa5f40
  Module Name
73571000    C:\WINDOWS\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll

0:000> !sos.Threads
ThreadCount:      2
UnstartedThread:  0
BackgroundThread: 2
PendingThread:    0
DeadThread:       0
Hosted Runtime:   no
                                                                         Lock  
       ID OSID ThreadOBJ    State GC Mode     GC Alloc Context  Domain   Count Apt Exception
   0    1 4538 00f91110     20220 Preemptive  02FE1238:00000000 00f58be0 1     Ukn 
   7    2 250c 00f9da88     21220 Cooperative 00000000:00000000 00f58be0 1     Ukn (Finalizer) 

測試 .NET Framework !sos 擴充功能

若要測試 SOS 偵錯延伸模組,請輸入 !sos.help。 然後嘗試 SOS 偵錯延伸模組所提供的其中一個命令。 例如,您可以嘗試 !sos.sostatus!sos.threads 命令。

0:030> !soshelp
crashinfo                                 Displays the crash details that created the dump.
help, soshelp <command>                   Displays help for a command.
loadsymbols <url>                         Loads symbols for all modules.
logclose <path>                           Disables console file logging.
logging <path>                            Enables/disables internal diagnostic logging.
logopen <path>                            Enables console file logging.
maddress                                  Displays a breakdown of the virtual address space.
modules, lm                               Displays the native modules in the process.
registers, r                              Displays the thread's registers.
runtimes <id>                             Lists the runtimes in the target or changes the default runtime.
setclrpath <path>                         Sets the path to load coreclr DAC/DBI files.
setsymbolserver, SetSymbolServer <url>    Enables and sets symbol server support for symbols and module download.
sosflush                                  Resets the internal cached state.
sosstatus                                 Displays internal status.
threads, setthread <thread>               Lists the threads in the target or sets the current thread.

備註

有時候 Managed 程式代碼應用程式會載入一個以上的 CLR 版本。 在此情況下,您必須指定要載入的 DAC 版本。 如需詳細資訊,請參閱 .cordllClrver.exe (CLR 版本工具)