次の方法で共有


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 には、!sos.dll をインストールするための dotnet CLI ツールがあります。 詳細については、「SOS インストーラー (dotnet-sos)」を参照してください。

元の .NET Framework

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 バージョン ツール) に関する記事を参照してください。