다음을 통해 공유


Windows 디버거를 사용하여 관리 코드 디버깅

Windows 디버거(WinDbg, CDB 및 NTSD)를 사용하여 관리 코드가 포함된 대상 애플리케이션을 디버그할 수 있습니다. 관리 코드를 디버그하려면 ! CLR 런타임과 함께 SOS 디버깅 확장(sos.dll) 및 데이터 액세스 구성 요소(mscordacwks.dll).

WinDbg와 같은 Windows 디버거는 Visual Studio 디버거와 별개입니다. Windows 디버거와 Visual Studio 디버거 간의 차이점에 대한 자세한 내용은 Windows용 디버깅 도구를 참조하세요.

이 문서에서는 Windows 디버거(WinDbg, CDB, NTSD)를 사용하여 .NET Framework, .NET Core 및 .NET 5+ 애플리케이션을 비롯한 관리 코드를 디버그하는 방법에 대한 지침을 제공합니다.

참고 항목

.NET Framework, .NET Core 및 .NET 5+ 애플리케이션을 디버깅할 때 최신 버전의 Windows 디버거 도구를 사용하고 있는지 확인합니다. 또한 보다 통합된 디버깅 환경을 위해 Visual Studio 또는 Visual Studio Code를 사용하는 것이 좋습니다. WinDbg는 더 복잡하고, 설정하는 데 더 많은 작업이 필요하며, 일반적으로 하위 수준 정보가 추가로 필요할 때 사용됩니다.

관리 코드 소개

관리 코드는 Microsoft .NET CLR(공용 언어 런타임)과 함께 실행됩니다. 관리 코드 애플리케이션에서 컴파일러가 생성하는 이진 코드는 플랫폼 독립적인 MSIL(Microsoft Intermediate Language)입니다.

관리 코드가 실행되면 런타임은 플랫폼별 네이티브 코드를 생성합니다. MSIL에서 네이티브 코드를 생성하는 프로세스를 JIT(Just-In-Time) 컴파일이라고 합니다. 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 버전 확인(Determine)을 참조하세요.

Debugging Managed Code(관리 코드 디버그)

!을 사용하여 관리 코드를 디버그하려면 SOS 디버깅 확장은 디버거가 다양한 구성 요소를 로드해야 합니다. ! SOS 디버깅 확장 및 .NET Core 및 원래 .NET Framework에 대해 다른 용도로 사용되는 필수 구성 요소입니다. 둘 중 하나의 경우 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 사용할 수 없는 경우 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 .NET과 통신하는 데 사용되는 추가 DLL에 대한 종속성이 있으므로 sos.dll 로드하는 것은 복잡할 수 있습니다. 또한 필요한 DLL 버전은 디버깅 중인 앱의 .NET 버전에 따라 달라지고 여러 버전의 .NET이 컴퓨터에 있을 수 있습니다.

종속 DLL의 올바른 버전을 로드하는 한 가지 전략은 sx, sxd, sxe, sxi, sxn, sxr, sx- (Set Exceptions)[를 사용하여 첫 번째 .NET clr 알림(CLRN)이 발생할 때 디버거에 중단하도록 요청하는 것입니다. /debuggercmds/sx--sxd--sxe--sxi--sxn--sxr--sx---set-exceptions-.md] 명령입니다. 대상 .NET 애플리케이션에 연결한 후에는 첫 번째 중단 후에 이 명령이 사용됩니다.

0:000> sxe CLRN

다음으로 실행을 다시 시작하고 중단이 발생할 때까지 기다립니다.

0:000> g

중단이 발생하면 clr.dll(또는 coreclr.dll)가 로드된 것으로 알고 있으므로 clr 알림 중단을 사용하지 않도록 설정합니다.

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.

주의

관리 코드 애플리케이션이 둘 이상의 CLR 버전을 로드하는 경우가 있습니다. 이 경우 로드할 DAC 버전을 지정해야 합니다. 자세한 내용은 .cordllClrver.exe(CLR 버전 도구)를 참조하세요.