SOS 디버깅 확장(SOS.dll)

SOS 디버깅 확장(SOS.dll)을 사용하면 내부 CLR(공용 언어 런타임) 환경에 대한 정보를 제공하여 관리되는 프로그램을 WinDbg.exe 디버거와 Visual Studio에서 쉽게 디버깅할 수 있습니다.

![command] [options] 

명령

명령 설명

BPMD [<module name> <method name>] [-md <MethodDesc>]

지정된 모듈의 지정된 메서드에 중단점을 만듭니다.

지정된 모듈 및 메서드가 로드되지 않은 경우 이 명령은 모듈이 로드되고 JIT(Just-In-Time) 컴파일되었다는 알림을 받을 때까지 기다렸다가 중단점을 만듭니다.

CLRStack [-a] [-l] [-p]

관리 코드의 스택 추적만 제공합니다.

-p 옵션은 관리되는 함수의 인수를 표시합니다.

-l 옵션은 지역 변수에 대한 정보를 프레임에 표시합니다. SOS 디버깅 확장에서는 로컬 이름을 검색할 수 없으므로 로컬 이름의 출력은 <local address> = <value> 형식입니다.

-a(모두) 옵션은 -l 옵션과 -p 옵션을 동시에 지정하는 옵션입니다.

SOS 디버깅 확장에서는 x64 및 IA-64 기반 플랫폼에 전환 프레임을 표시하지 않습니다.

COMState

각 스레드의 COM 아파트 모델과 Context 포인터를 나열합니다(사용할 수 있는 경우).

DumpArray [-start <startIndex>] [-length <length>] [-details] [-nofields] <array object address>

- 또는 -

DA [-start <startIndex>] [-length <length>] [-detail] [-nofields] array object address>

배열 개체의 요소를 검사합니다.

-start 옵션은 요소를 표시할 위치의 시작 인덱스를 지정합니다.

-length 옵션은 표시할 요소 수를 지정합니다.

-detail 옵션은 DumpObjDumpVC 형식을 사용하여 요소의 세부 사항을 표시합니다.

-nofields 옵션은 배열이 표시되지 않도록 합니다. 이 옵션은 -detail 옵션을 지정한 경우에만 사용할 수 있습니다.

DumpAssembly <Assembly address>

어셈블리에 대한 정보를 표시합니다.

DumpAssembly 명령은 여러 개의 모듈(있는 경우)을 나열합니다.

DumpDomain 명령을 사용하여 어셈블리 주소를 가져올 수 있습니다.

DumpClass <EEClass address>

형식과 연관된 EEClass 구조체에 대한 정보를 표시합니다.

DumpClass 명령은 정적 필드 값만 표시하고 비정적 필드 값은 표시하지 않습니다.

EEClass 구조체 주소를 가져오려면 DumpMT, DumpObj, Name2EE 또는 Token2EE 명령을 사용합니다.

DumpDomain [<Domain address>]

지정된 AppDomain 개체 주소 내에 로드된 각 Assembly 개체를 열거합니다. 매개 변수 없이 호출된 경우 DumpDomain 명령은 프로세스의 모든 AppDomain 개체를 나열합니다.

DumpHeap [-stat] [-min <size>][-max <size>] [-thinlock] [-mt <MethodTable address>] [-type <partial type name>][start [end]]

가비지 수집된 힙에 대한 정보와 개체에 대한 컬렉션 통계를 표시합니다.

DumpHeap 명령은 가비지 수집기 힙에서 과도한 단편화가 감지될 경우 경고를 표시합니다.

-stat 옵션은 출력을 통계 형식 요약으로 제한합니다.

-min 옵션은 바이트로 지정된 size 매개 변수보다 작은 개체를 무시합니다.

-max 옵션은 바이트로 지정된 size 매개 변수보다 큰 개체를 무시합니다.

-thinlock 옵션은 ThinLocks를 보고합니다. 자세한 내용은 SyncBlk 명령을 참조하십시오.

-mt 옵션은 지정된 MethodTable 구조체에 해당하는 개체만 나열합니다.

-type 옵션은 형식 이름이 지정된 문자열의 부분 문자열에 해당하는 개체만 나열합니다.

start 매개 변수는 지정된 주소부터 나열을 시작합니다.

end 매개 변수는 지정된 주소에서 나열을 중지합니다.

DumpIL [<DynamicMethod address>] [<DynamicMethodDesc address>] [<MethodDesc address>]

관리되는 메서드와 연관된 IL(Intermediate Language)을 표시합니다.

동적 IL은 어셈블리에서 로드된 IL과는 다르게 내보내집니다. 동적 IL은 메타데이터 토큰 대신 관리되는 개체 배열의 개체를 참조합니다.

DumpLog [<Filename>]

메모리 내 스트레스 로그의 내용을 지정된 파일에 씁니다. 이름을 지정하지 않으면 이 명령은 현재 디렉터리에 Stresslog.txt라는 파일을 만듭니다.

공용 언어 런타임에서는 스트레스 오류를 진단하는 데 유용한 메모리 내 스트레스 로그를 제공합니다. 이 로그를 사용하면 잠금이나 I/O를 사용하지 않고도 오류를 진단할 수 있습니다. 스트레스 로그를 사용하도록 설정하려면 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework 아래의 다음 레지스트리 키를 설정합니다.

(DWORD) StressLog = 1

(DWORD) LogFacility = 0xffffffff

(DWORD) StressLogSize = 65536

DumpMD <MethodDesc address>

지정된 주소의 MethodDesc 구조체에 대한 정보를 표시합니다.

IP2MD 명령을 사용하여 관리되는 함수에서 MethodDesc 구조체 주소를 가져올 수 있습니다.

DumpMT [-MD] <MethodTable address>

지정된 주소의 메서드 테이블에 대한 정보를 표시합니다. -MD 옵션을 지정하면 개체와 함께 정의된 모든 메서드의 목록이 표시됩니다.

관리되는 각 개체에는 메서드 테이블 포인터가 들어 있습니다.

DumpMethodSig <sigaddr> <moduleaddr>

지정된 주소의 MethodSig 구조체에 대한 정보를 표시합니다.

DumpModule [-mt] <Module address>

지정된 주소의 모듈에 대한 정보를 표시합니다. -mt 옵션은 모듈에 정의된 형식과 모듈에서 참조하는 형식을 표시합니다.

DumpDomain 또는 DumpAssembly 명령을 사용하여 모듈의 주소를 검색할 수 있습니다.

DumpObj <object address>

- 또는 -

DO <object address>

지정된 주소의 개체에 대한 정보를 표시합니다. DumpObj 명령은 필드, EEClass 구조체 정보, 메서드 테이블 및 개체 크기를 표시합니다.

DumpStackObjects 명령을 사용하여 개체의 주소를 검색할 수 있습니다.

CLASS 형식의 필드도 개체이므로 이러한 필드에 대해 DumpObj 명령을 실행할 수 있습니다.

DumpRuntimeTypes

가비지 수집기 힙에 있는 런타임 형식 개체를 표시하고 해당 개체에 연관된 형식 이름과 메서드 테이블을 나열합니다.

DumpStack [-EE] [top stack [bottom stack]]

스택 추적을 표시합니다.

-EE 옵션을 사용하면 DumpStack 명령은 관리되는 함수만 표시합니다. x86 플랫폼에 표시되는 스택 프레임을 제한하려면 topbottom 매개 변수를 사용합니다.

x86 플랫폼에서 DumpStack 명령은 자세한 스택 추적을 만듭니다.

x64 및 IA-64 기반 플랫폼에서 DumpStack 명령은 디버거의 K 명령과 비슷하게 동작합니다. topbottom 매개 변수는 x64 및 IA-64 기반 플랫폼에서 무시됩니다.

DumpSig <sigaddr> <moduleaddr>

지정된 주소의 Sig 구조체에 대한 정보를 표시합니다.

DumpStackObjects [-verify] [top stack [bottom stack]]

- 또는 -

DSO [-verify] [top stack [bottom stack]]

현재 스택의 범위 내에 있는 관리되는 모든 개체를 표시합니다.

-verify 옵션은 개체 필드의 각 비정적 CLASS 필드에 대해 유효성을 검사합니다.

지역 변수 및 매개 변수의 값을 확인하려면 K 명령 및 CLRStack 명령과 같은 스택 추적 명령과 함께 DumpStackObject 명령을 사용합니다.

DumpVC <MethodTable address> <Address>

지정된 주소에 있는 값 클래스의 필드에 대한 정보를 표시합니다.

MethodTable 매개 변수를 사용하면 DumpVC 명령은 필드를 올바르게 해석할 수 있습니다. 값 클래스에는 첫 번째 필드로 메서드 테이블이 포함되지 않습니다.

EEHeap [-gc] [-loader]

내부 공용 언어 런타임 데이터 구조에서 사용되는 프로세스 메모리에 대한 정보를 표시합니다.

-gc-loader 옵션은 이 명령의 출력을 가비지 수집기나 로더 데이터 구조로 제한합니다.

가비지 수집기에 대한 정보에는 관리되는 힙의 각 세그먼트 범위가 나열됩니다. EEHeap -gc로 지정된 세그먼트 범위 내에 포인터가 있으면 해당 포인터는 개체 포인터입니다.

EEStack [-short] [-EE]

프로세스의 모든 스레드에 대해 DumpStack 명령을 실행합니다.

-EE 옵션은 DumpStack 명령에 직접 전달됩니다. -short 매개 변수는 출력을 다음과 같은 종류의 스레드로 제한합니다.

  1. 잠긴 스레드

  2. 가비지 수집을 위해 중단된 스레드

  3. 현재 관리 코드에 있는 스레드

EEVersion

공용 언어 런타임 버전을 표시합니다.

EHInfo [<MethodDesc address>] [<Code address>]

지정된 메서드의 예외 처리 블록을 표시합니다. 이 명령은 절 블록(try 블록) 및 처리기 블록(catch 블록)의 코드 주소와 오프셋을 표시합니다.

FinalizeQueue [-detail]

종료하도록 등록된 모든 개체를 표시합니다.

-detail 옵션은 정리를 기다리는 모든 SyncBlocks와 RCW(RuntimeCallableWrappers)에 대한 추가 정보를 표시합니다. 두 데이터 구조는 모두 종료자 스레드에서 캐시되고 정리됩니다.

FindAppDomain <Object address>

지정된 주소에 있는 개체의 응용 프로그램 도메인을 확인합니다.

GCHandles [-perdomain]

프로세스의 가비지 수집기 핸들에 대한 통계를 표시합니다.

-perdomain 옵션을 전달하면 통계가 응용 프로그램 도메인별로 정렬됩니다.

가비지 수집기 핸들 누수로 인한 메모리 누수를 확인하려면 GCHandles 명령을 사용합니다. 예를 들어, 강력한 가비지 수집기 핸들이 코드에서 큰 배열을 가리키고 있어서 아직 배열이 해제되지 않은 상태로 핸들을 삭제하면 메모리 누수가 발생합니다.

GCHandleLeaks

메모리에서 프로세스의 강력하고 고정된 가비지 수집기 핸들에 대한 참조를 검색하여 결과를 표시합니다. 핸들이 있으면 GCHandleLeaks 명령은 참조의 주소를 표시합니다. 메모리에 핸들이 없으면 이 명령은 알림을 표시합니다.

GCInfo <MethodDesc address> <Code address>

레지스터 또는 스택 위치에 관리되는 개체가 포함되는 시기를 나타내는 데이터를 표시합니다. 가비지 수집이 수행될 때 수집기에서는 개체에 대한 참조의 위치를 알고 있어야 새 개체 포인터 값으로 업데이트할 수 있습니다.

GCRoot [-nostacks] <Object address>

지정된 주소의 개체에 대한 참조(또는 루트)와 관련된 정보를 표시합니다.

GCRoot 명령은 다른 개체 내의 핸들과 스택의 핸들에 대한 핸들 테이블 및 관리되는 전체 힙을 검사합니다. 그런 다음 각 스택에서 개체에 대한 포인터를 검색하고 종료자 큐도 검색합니다.

이 명령은 스택 루트가 유효하거나 삭제되었는지는 확인하지 않습니다. 스택 루트가 여전히 사용 중인지 여부를 확인하기 위해 로컬 또는 인수 값이 속해 있는 프레임을 디스어셈블하려면 CLRStackU 명령을 사용합니다.

-nostacks 옵션은 검색을 가비지 수집기 핸들 및 종료-연결(freachable) 개체로 제한합니다.

help [<command>] [<faq>]

매개 변수가 지정되지 않은 경우 사용할 수 있는 모든 명령을 표시하거나, 지정된 명령에 대한 자세한 도움말 정보를 표시합니다.

faq 매개 변수는 질문과 대답을 표시합니다.

IP2MD <Code address>

JIT(Just-In-Time) 컴파일된 코드의 지정된 주소에 있는 MethodDesc 구조체를 표시합니다.

MinidumpMode [0] [1]

미니덤프를 사용할 때 안전하지 않은 명령이 실행되지 않도록 합니다.

이 기능을 해제하려면 0을 전달하고, 설정하려면 1을 전달합니다. 기본적으로 MinidumpMode 값은 0으로 설정되어 있습니다.

.dump /m 명령이나 .dump 명령으로 만들어진 미니덤프에는 제한된 CLR 관련 데이터가 있으며 이 미니덤프를 사용하면 SOS 명령의 하위 집합만 올바르게 실행할 수 있습니다. 일부 명령은 필요한 메모리 영역이 매핑되지 않거나 부분적으로만 매핑되었기 때문에 예기치 않은 오류와 함께 실패할 수 있습니다. 이 옵션은 미니덤프에 대해 안전하지 않은 명령이 실행되지 않도록 합니다.

Name2EE <module name> <type or method name>

- 또는 -

Name2EE <module name>!<type or method name>

지정된 모듈에 있는 지정된 형식 또는 메서드의 MethodTable 구조체와 EEClass 구조체를 표시합니다.

지정된 모듈은 프로세스에 로드되어 있어야 합니다.

올바른 형식 이름을 가져오려면 MSIL 디스어셈블러(Ildasm.exe)를 사용하여 모듈을 찾습니다. *를 module name 매개 변수로 전달하여 로드된 모든 관리되는 모듈을 검색할 수도 있습니다. module name 매개 변수는 mscorlib 또는 image00400000과 같이 모듈의 디버거 이름일 수도 있습니다.

이 명령은 Windows 디버거 구문인 <module>!<type>을 지원합니다. 해당 형식은 정규화된 형식이어야 합니다.

ObjSize [<Object address>]

지정된 개체의 크기를 표시합니다. 매개 변수가 없으면 ObjSize 명령은 관리되는 스레드에 있는 모든 개체의 크기를 표시하고, 프로세스의 모든 가비지 수집기 핸들을 표시하고, 이러한 핸들이 가리키는 모든 개체의 총 크기를 나타냅니다. ObjSize 명령은 부모 개체뿐 아니라 모든 자식 개체의 크기도 포함합니다.

PrintException [-nested] [<Exception object address>]

- 또는 -

PE [-nested] [<Exception object address>]

지정된 주소의 Exception 클래스에서 파생된 개체 필드를 표시하고 필드의 형식을 지정합니다. 주소를 지정하지 않으면 PrintException 명령은 현재 스레드에서 마지막으로 throw된 예외를 표시합니다.

-nested 옵션은 중첩된 예외 개체에 대한 자세한 정보를 표시합니다.

이 명령을 사용하여 이진 배열인 _stackTrace 필드의 형식을 지정하고 해당 필드를 볼 수 있습니다.

ProcInfo [-env] [-time] [-mem]

프로세스의 환경 변수, 커널 CPU 시간 및 메모리 사용 통계를 표시합니다.

RCWCleanupList <RCWCleanupList address>

지정된 주소에서 정리를 기다리는 런타임 호출 가능 래퍼의 목록을 표시합니다.

SaveModule <Base address> <Filename>

지정된 주소의 메모리에 로드된 이미지를 지정된 파일에 씁니다.

StopOnException [-derived] [-create | -create2] <Exception> <Pseudo-register number>

지정된 예외가 throw되면 디버거가 중지되고 다른 예외가 throw되면 계속 실행되도록 합니다.

-derived 옵션은 지정된 예외와 지정된 예외에서 파생되는 모든 예외를 catch합니다.

SyncBlk [-all | <syncblk number>]

지정된 SyncBlock 구조체나 모든 SyncBlock 구조체를 표시합니다. 인수를 전달하지 않으면 SyncBlk 명령은 스레드에서 소유하는 개체에 해당하는 SyncBlock 구조체를 표시합니다.

SyncBlock 구조체는 모든 개체에 대해 만들 필요는 없는 추가 정보를 포함하기 위한 컨테이너입니다. 이 구조체는 COM interop 데이터, 해시 코드 및 스레드로부터 안전한 작업에 대한 잠금 정보를 포함할 수 있습니다.

ThreadPool

큐에 대기 중인 작업 요청 수, 완료 포트 스레드 수 및 타이머 수를 비롯하여 관리되는 스레드 풀에 대한 정보를 표시합니다.

Token2EE <module name> <token>

지정된 모듈의 지정된 메타데이터 토큰을 MethodTable 구조체나 MethodDesc 구조체로 전환합니다.

module name 매개 변수에 *를 전달하면 로드된 모든 관리되는 모듈에서 해당 토큰이 매핑되는 대상을 확인할 수 있습니다. mscorlib 또는 image00400000과 같이 모듈의 디버거 이름을 전달할 수도 있습니다.

Threads [-live] [-special]

프로세스의 관리되는 모든 스레드를 표시합니다.

Threads 명령은 디버거 약식 ID, 공용 언어 런타임 스레드 ID 및 운영 체제 스레드 ID를 표시합니다. 또한 Threads 명령은 스레드가 실행되고 있는 응용 프로그램 도메인을 나타내는 Domain 열, COM 아파트 모드가 표시되는 APT 열 및 해당 스레드에서 마지막으로 throw된 예외가 표시되는 Exception 열을 표시합니다.

-live 옵션은 라이브 스레드와 연관된 스레드를 표시합니다.

-special 옵션은 CLR에서 만들어진 모든 특수 스레드를 표시합니다. 특수 스레드에는 동시 GC(가비지 수집) 및 서버 GC의 GC 스레드, Debugger 도우미 스레드, Finalizer 스레드, AppDomain Unload 스레드 및 Threadpool 타이머 스레드가 포함됩니다.

TraverseHeap [-xml] <filename>

힙 정보를 CLR 프로파일러에서 인식할 수 있는 형식으로 지정된 파일에 씁니다. -xml 옵션을 사용하면 TraverseHeap 명령은 파일을 XML 형식으로 지정합니다.

CLR 프로파일러는 https://www.microsoft.com/downloads/details.aspx?familyid=86CE6052-D7F4-4AEB-9B7A-94635BEEBDDA에서 다운로드할 수 있습니다.

U [-gcinfo] [-ehinfo] <MethodDesc address> | <Code address>

메서드의 MethodDesc 구조체 포인터나 메서드 본문 내의 코드 주소로 지정된 관리되는 메서드에 대해 주석이 지정된 디스어셈블리를 표시합니다. U 명령은 메서드를 처음부터 끝까지 모두 표시하고 메타데이터 토큰을 이름으로 변환하는 주석을 함께 표시합니다.

-gcinfo 옵션을 사용하면 U 명령은 메서드의 GCInfo 구조체를 표시합니다.

-ehinfo 옵션은 메서드에 대한 예외 정보를 표시합니다. EHInfo 명령을 사용하여 이 정보를 볼 수도 있습니다.

VerifyHeap

가비지 수집기 힙에서 손상된 곳이 있는지 확인하고 찾은 오류를 표시합니다.

플랫폼 호출 서비스에 대한 호출이 올바르지 않게 생성되면 힙이 손상될 수 있습니다.

VMMap

가상 주소 공간으로 이동하여 각 영역에 적용된 보호 형식을 표시합니다.

VMStat

가상 주소 공간의 요약 뷰를 제공합니다. 이 뷰에서는 해당 메모리에 적용된 각 보호 형식(사용 가능, 예약됨, 커밋됨, 전용, 매핑됨, 이미지)별로 정렬됩니다. TOTAL 열에는 AVERAGE 열에 BLK COUNT 열을 곱한 결과가 표시됩니다.

설명

SOS 디버깅 확장을 사용하려면 WinDbg.exe 디버거나 Visual Studio 2005 또는 이전 버전에서 SOS 디버깅 확장을 로드합니다. WinDgb.exe 또는 Visual Studio의 직접 실행 창 내에서 명령을 실행할 수 있습니다.

SOS 디버깅 확장을 사용하면 공용 언어 런타임 내에서 실행되는 코드에 대한 정보를 볼 수 있습니다. 예를 들어, SOS 디버깅 확장을 사용하여 관리되는 힙에 대한 정보를 표시하고, 힙 손상을 찾고, 런타임에 사용되는 내부 데이터 형식을 표시하고, 런타임 내에서 실행되는 관리되는 모든 코드에 대한 정보를 볼 수 있습니다.

SOS 디버깅 확장 로딩

WinDbg.exe 디버거에 SOS 디버깅 확장을 로드하려면 해당 도구에서 다음 명령을 실행하고, Visual Studio에 SOS 디버깅 확장을 로드하려면 디버깅하는 동안 직접 실행 창에서 다음 명령을 실행합니다.

.loadby sos

SOS 디버깅 확장을 로드하려면 먼저 솔루션의 프로젝트 설정에서 관리되지 않는 디버깅을 사용하도록 설정해야 합니다. 일부 언어의 경우 관리되지 않는 디버깅은 기본적으로 사용하지 않도록 설정되어 있습니다.

참고 Visual Studio 2005에서 직접 실행 창을 표시하려면 디버그 메뉴를 클릭하고 메뉴를 클릭한 다음 직접 실행 옵션을 클릭합니다. Visual Studio에서 Ctrl+Alt+I를 선택하여 직접 실행 창을 열 수도 있습니다.

WinDbg.exe 및 Visual Studio에서는 현재 사용 중인 Mscorwks.dll 버전에 해당하는 버전의 SOS.dll을 사용합니다. .NET Framework의 버전 1.1 및 2.0의 경우 SOS.dll은 Mscorwks.dll과 동일한 디렉터리에 설치됩니다. 기본적으로 현재 Mscorwks.dll 버전과 일치하는 버전의 SOS.dll을 사용해야 합니다.

다른 컴퓨터에서 만든 덤프 파일을 사용하려면 해당 프로그램과 함께 설치된 Mscorwks.dll 파일이 기호 경로에 있는지 확인하고 해당하는 버전의 SOS.dll을 로드해야 합니다.

특정 버전의 SOS.dll을 로드하려면 Windows 디버거에 다음 명령을 입력합니다.

.load <full path to sos.dll>

예제

다음 명령은 00ad28d0 주소에 있는 배열의 내용을 표시합니다. 두 번째 요소부터 시작하여 다섯 개의 요소까지 계속해서 표시합니다.

!dumparray -start 2 -length 5 -detail 00ad28d0 

다음 명령은 1ca248 주소에 있는 어셈블리의 내용을 표시합니다.

!dumpassembly 1ca248

다음 명령은 가비지 수집기 힙에 대한 정보를 표시합니다.

!dumpheap

다음 명령은 현재 디렉터리의 Stresslog.txt 파일에 메모리 내 스트레스 로그의 내용을 씁니다.

!DumpLog

다음 명령은 902f40 주소의 MethodDesc 구조체를 표시합니다.

!dumpmd 902f40

다음 명령은 1caa50 주소의 모듈에 대한 정보를 표시합니다.

!dumpmodule 1caa50

다음 명령은 a79d40 주소의 개체에 대한 정보를 표시합니다.

!DumpObj a79d40

다음 명령은 0090320c 주소에서 메서드 테이블을 사용하여 00a79d9c 주소의 값 클래스 필드를 표시합니다.

!DumpVC 0090320c 00a79d9c

다음 명령은 가비지 수집기에서 사용되는 프로세스 메모리를 표시합니다.

!eeheap -gc

다음 명령은 종료하도록 예약된 모든 개체를 표시합니다.

!finalizequeue

다음 명령은 00a79d98 주소에 있는 개체의 응용 프로그램 도메인을 확인합니다.

!findappdomain 00a79d98

다음 명령은 현재 프로세스의 모든 가비지 수집기 핸들을 표시합니다.

!gcinfo 5b68dbb8 

다음 명령은 unittest.exe 모듈에 있는 MainClass 클래스의 Main 메서드에 대한 MethodTableEEClass 구조체를 표시합니다.

!name2ee unittest.exe MainClass.Main

다음 명령은 unittest.exe 모듈에 있는 02000003 주소의 메타데이터 토큰에 대한 정보를 표시합니다.

!token2ee unittest.exe 02000003

참고 항목

참조

.NET Framework 도구
SDK 명령 프롬프트