Windows デバッガーを使用したマネージド コードのデバッグ
Windows デバッガー (WinDbg、CDB、および NTSD) を使用して、マネージド コードを含むターゲット アプリケーションをデバッグできます。 マネージ コードをデバッグするには、!SOS デバッグ拡張機能 (sos.dll) とデータ アクセス コンポーネント (mscordacwks.dll) を CLR ランタイムと組み合わせて使用します。
WinDbg などの Windows デバッガーは、Visual Studio デバッガーとは別です。 Windows デバッガーと Visual Studio デバッガーの違いについては、「Windows 用デバッグ ツール」を参照してください。
この記事では、Windows デバッガー (WinDbg、CDB、NTSD) を使用して、.NET Framework、.NET Core、.NET 5 以降のアプリケーションなどのマネージ コードをデバッグする手順について説明します。
Note
.NET Framework、.NET Core、および .NET 5 以降のアプリケーションをデバッグする場合は、最新バージョンの Windows デバッガー ツールを使用していることを確認してください。 さらに、より統合された環境でデバッグを行うには、Visual Studio または Visual Studio Code の使用を検討してください。 WinDbg の方が複雑で、セットアップに手間がかかり、一般的には付加的な低水準情報が求められる場合に使用されます。
マネージド コードの概要
マネージド コードは、Microsoft .NET 共通言語ランタイム (CLR) と共に実行されます。 マネージド コード アプリケーションでは、コンパイラによって生成されるバイナリ コードは、プラットフォームに依存しない Microsoft Intermediate Language (MSIL) になります。
マネージド コードが実行されると、ランタイムがプラットフォーム固有のネイティブ コードを生成します。 MSIL からネイティブ コードを生成するプロセスは、Just-In-Time (JIT) コンパイルと呼ばれます。 JIT コンパイラが特定のメソッドの MSIL をコンパイルした後、メソッドのネイティブ コードがメモリ内に残ります。 後でこのメソッドが呼び出されるたびに、ネイティブ コードが実行され、JIT コンパイラが関与する必要はありません。
マネージド コードは、さまざまなソフトウェア プロデューサーによって製造された複数のコンパイラを使用してビルドできます。 特に、Microsoft Visual Studio では、マネージド拡張機能を使用して、C#、Visual Basic、JScript、C++ など、いくつかの異なる言語からマネージド コードをビルドできます。
CLR は、.NET Framework が更新されるたびに更新されるわけではありません。 たとえば、.NET Framework のバージョン 2.0、3.0、および 3.5 はすべて、CLR のバージョン 2.0 を使用します。 .NET バージョンの詳細については、「.NET Framework のバージョンおよび依存関係」を参照してください。 PC 上の .NET のバージョンを確認する方法については、「インストールされている .NET Framework バージョンを確認する」を参照してください。
マネージド コードをデバッグする
!SOS デバッグ拡張機能を使用してマネージ コードをデバッグするには、デバッガーでさまざまなコンポーネントを読み込む必要があります。 .NET Core と元の .NET Framework では、使用される !SOS デバッグ拡張機能と必須コンポーネントが異なります。 いずれの場合も、Data Access Component (DAC) (mscordacwks.dll) が使用されます。
.NET SDK には、.NET アプリのデバッグに役立つ可能性のあるツールが用意されています。 詳細については、「.NET SDK とは」を参照してください。
.NET Core
- .NET Core または .NET 5 以降のバージョンの場合、ランタイムは
coreclr.dll
です。 詳細については、「共通言語ランタイム (CLR) の概要」を参照してください。 - .NET Core SOS デバッグ拡張機能
.NET Core には、!sos.dll をインストールするための dotnet CLI ツールがあります。 詳細については、「SOS インストーラー (dotnet-sos)」を参照してください。
元の .NET Framework
- 元の .NET Framework の場合、
clr.dll
がランタイムです。 - SOS デバッグ拡張機能 (sos.dll)
SOS デバッグ拡張機能 (sos.dll) の取得
SOS デバッグ拡張機能 (sos.dll) ファイルは、Windows 用デバッグ ツールのすべてのバージョンには含まれていません。 sos.dll を使用できない場合は、SOS を Windows にインストールする方法に関するドキュメントを参照してください。
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 ファイルへの完全なパスを指定する必要があります。 通常、SOS.dll ファイルは、.NET Core または .NET Framework のインストールのランタイム ディレクトリにあります。
0:000> .load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll
特定バージョンの sos.dll の読み込み
sos.dll の読み込みは、.NET との通信に sos.dll で使用される追加の DLL に依存しているため、複雑になる可能性があります。 さらに、必要な DLL バージョンはデバッグ対象のアプリの .NET バージョンに依存し、コンピューター上に複数のバージョンの .NET が存在する場合もあります。
依存 DLL の正しいバージョンをロードする方法の 1 つは、sx、sxd、sxe、sxi、sxn、sxr、sx- (例外の設定)[../debuggercmds/sx--sxd--sxe--sxi--sxn--sxr--sx---set-exceptions-.md] コマンドを使用して、最初の .NET clr 通知 (CLRN) が発生したときにデバッガーにブレークインを要求することです。 ターゲットの .NET アプリケーションにアタッチすると、最初のブレークイン後にこのコマンドが使用されます。
0:000> sxe CLRN
次に、実行を再開し、ブレークの発生を待ちます。
0:000> g
ブレークが発生したら、clr.dll (または coreclr.dll) が読み込まれたことがわかっているので、clr 通知ブレークを無効にします。
0:000> sxd CLRN
デバッガーのこのコンテキストで .loadby を使用して、同じ "付近の" ディレクトリから !sos を読み込みます。
0:000> .loadby sos clr
もう 1 つのオプションは、.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 デバッグ拡張機能によって提供されるコマンドのいずれかを試します。 たとえば、.NET Core SOS デバッグ拡張機能によって提供される !sos.DumpDomain または !sos.Threads コマンドを試すことができます。
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.
メモ
マネージド コード アプリケーションが複数のバージョンの CLR を読み込むことがあります。 その場合は、読み込む DAC のバージョンを指定する必要があります。 詳細については、.cordll および Clrver.exe (CLR バージョン ツール) に関する記事を参照してください。