다음을 통해 공유


.NET 디버거 확장

.NET 디버거 확장을 사용하면 라이브 프로세스와 덤프 모두에서 .NET 런타임 내에서 실행되는 코드에 대한 정보를 볼 수 있습니다. 확장은 Windbg미리 설치되며 LLDB에서 사용하기 위해 다운로드할 수 있습니다. .NET 디버거 확장을 사용하여 다음을 수행할 수 있습니다.

  • 관리되는 힙에 대한 정보를 수집합니다.
  • 힙 손상을 찾습니다.
  • 런타임에서 사용하는 내부 데이터 형식을 표시합니다.
  • 런타임 내에서 실행되는 모든 관리 코드에 대한 정보를 봅니다.

.NET 디버거 확장에는 기존 dotnet-sos 도구의 명령과 새 명령이 포함됩니다. 이제 네이티브 AOT 런타임에도 제한된 명령 집합이 지원됩니다.

통사론

바람 아래: ![command] [options]

LLDB: sos [command] [options]

대부분의 명령에는 LLDB 아래에 별칭 또는 바로 가기가 있습니다. clrstack [options]

명령을

다음 명령 표는 도움말 또는 soshelp아래에서도 사용할 수 있습니다. 개별 명령 도움말은 soshelp <command>사용하여 사용할 수 있습니다.

명령 묘사
bpmd [-nofuturemodule] [<모듈 이름><메서드 이름>] [-md<MethodDesc>] -list-clear<보류 중인 중단점 번호>-clearall 지정된 모듈의 지정된 메서드에 중단점을 만듭니다.

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

-list, -clear-clearall 옵션을 사용하여 보류 중인 중단점 목록을 관리할 수 있습니다.

-list 옵션은 보류 중인 모든 중단점 목록을 생성합니다. 보류 중인 중단점에 0이 아닌 모듈 ID가 있는 경우 해당 중단점은 로드된 특정 모듈의 함수와 관련이 있습니다. 보류 중인 중단점에 모듈 ID가 0인 경우 해당 중단점은 아직 로드되지 않은 모듈에 적용됩니다.

-clear 또는 -clearall 옵션을 사용하여 목록에서 보류 중인 중단점을 제거합니다.
CLRStack [-a] [-l] [-p] [-n] [-f] [-r] [-all] 관리 코드의 스택 추적만 제공합니다.

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

-l 옵션은 프레임의 지역 변수에 대한 정보를 표시합니다. .NET 디버거 확장은 로컬 이름을 검색할 수 없으므로 로컬 이름에 대한 출력은 로컬 주소형식입니다.

-a 옵션은 -l-p 결합된 바로 가기입니다.

-n 옵션은 원본 파일 이름 및 줄 번호 표시를 사용하지 않도록 설정합니다. 디버거에 SYMOPT_LOAD_LINES 지정한 옵션이 있는 경우 SOS는 관리되는 모든 프레임에 대한 기호를 조회하고 성공하면 해당 원본 파일 이름과 줄 번호를 표시합니다. 이 동작을 사용하지 않도록 설정하려면 -n(줄 번호 없음) 매개 변수를 지정할 수 있습니다.

-f 옵션(전체 모드)은 관리되는 프레임과 혼합된 네이티브 프레임과 관리되는 프레임의 어셈블리 이름 및 함수 오프셋을 표시합니다. 이 옵션은 dotnet-dump함께 사용할 때 네이티브 프레임을 표시하지 않습니다.

-r 옵션은 각 스택 프레임에 대한 레지스터를 덤프합니다.

-all 옵션은 모든 관리되는 스레드의 스택을 덤프합니다.
COMState 각 스레드에 대한 COM 아파트 모델 및 Context 포인터(사용 가능한 경우)를 나열합니다. 이 명령은 Windows에서만 지원됩니다.
DumpArray [-start<startIndex>] [-length<length>] [-details] [-nofields] <배열 개체 주소>

-또는-

DA [-start<startIndex>] [-length<length>] [-details] [-nofields] 배열 개체 주소>
배열 개체의 요소를 검사합니다.

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

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

-details 옵션은 DumpObjDumpVC 형식을 사용하여 요소의 세부 정보를 표시합니다.

-nofields 옵션을 사용하면 배열이 표시되지 않습니다. 이 옵션은 -details 옵션이 지정된 경우에만 사용할 수 있습니다.
DumpAsync (dumpasync) [-mt<MethodTable address>] [-type<partial type name>] [-waiting] [-root] DumpAsync는 가비지 수집된 힙을 트래버스하고 비동기 메서드의 상태가 힙으로 전송될 때 생성된 비동기 상태 컴퓨터를 나타내는 개체를 찾습니다. 이 명령은 async void, async Task, async Task<T>, async ValueTaskasync ValueTask<T>정의되는 비동기 상태 컴퓨터를 인식합니다.

출력에는 찾은 각 비동기 상태 컴퓨터 개체에 대한 세부 정보 블록이 포함됩니다. 이러한 세부 정보는 다음과 같습니다.
- MethodTable 주소, 개체 주소, 크기 및 형식 이름을 포함하여 비동기 상태 컴퓨터 개체의 형식에 대한 줄입니다.
- 개체에 포함된 상태 시스템 유형 이름에 대한 줄입니다.
- 상태 컴퓨터의 각 필드 목록입니다.
- 하나 이상의 등록 된 경우이 상태 컴퓨터 개체에서 연속에 대 한 줄입니다.
- 이 비동기 상태 컴퓨터 개체에 대한 GC 루트를 발견했습니다.

네이티브 AOT 애플리케이션에 대해 지원됩니다.
DumpAssembly<어셈블리 주소> 어셈블리에 대한 정보를 표시합니다.

DumpAssembly 명령은 여러 모듈이 있는 경우 나열합니다.

DumpDomain 명령을 사용하여 어셈블리 주소를 가져올 수 있습니다.
DumpClass<EEClass 주소> 형식과 연결된 EEClass 구조체에 대한 정보를 표시합니다.

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

DumpMT, DumpObj, Name2EE또는 Token2EE 명령을 사용하여 EEClass 구조체 주소를 가져옵니다.
DumpDomain [<도메인 주소>] 지정된 AppDomain 개체 주소 내에 로드되는 각 Assembly 개체를 열거합니다. 매개 변수 없이 호출되는 경우 DumpDomain 명령은 프로세스의 모든 AppDomain 개체를 나열합니다. .NET(Core)에는 하나의 AppDomain있으므로 DumpDomain 하나의 개체만 반환합니다.
DumpHeap [-stat] [-strings] [-short] [-min<size>] [-max<size>] [-thinlock] [-startAtLowerBound] [-mt<MethodTable address>] [-type<partial type name>] [start [end]] 개체에 대한 가비지 수집 힙 및 컬렉션 통계에 대한 정보를 표시합니다.

DumpHeap 명령은 가비지 수집기 힙에서 과도한 조각화를 감지하면 경고를 표시합니다.

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

-strings 옵션은 출력을 통계 문자열 값 요약으로 제한합니다.

-short 옵션은 출력을 각 개체의 주소로 제한합니다. 이 명령을 사용하면 자동화를 위해 명령의 출력을 다른 디버거 명령으로 쉽게 파이프할 수 있습니다.

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

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

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

-startAtLowerBound 옵션은 제공된 주소 범위의 하한에서 힙 워크를 강제로 시작합니다. 계획 단계에서는 개체가 이동되기 때문에 힙을 걸을 수 없는 경우가 많습니다. 이 옵션을 사용하면 DumpHeap 지정된 하한에서 연습을 시작합니다. 이 옵션이 작동하려면 유효한 개체의 주소를 하한으로 제공해야 합니다. 잘못된 개체의 주소에 메모리를 표시하여 다음 메서드 테이블을 수동으로 찾을 수 있습니다. 가비지 수집이 현재 memcopy호출 중인 경우 매개 변수로 제공되는 시작 주소에 크기를 추가하여 다음 개체의 주소를 찾을 수도 있습니다.

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

-type 옵션은 형식 이름이 지정된 문자열의 부분 문자열 일치 항목인 개체만 나열합니다.

start 매개 변수는 지정된 주소에서 목록을 시작합니다.

end 매개 변수는 지정된 주소의 목록을 중지합니다.

네이티브 AOT 애플리케이션에 대해 지원됩니다.
DumpIL<Managed DynamicMethod 개체> | <DynamicMethodDesc 포인터> | <MethodDesc 포인터> 관리되는 메서드와 연결된 CIL(공용 중간 언어)을 표시합니다.

동적 CIL은 어셈블리에서 로드된 CIL과 다르게 내보내집니다. 동적 CIL은 메타데이터 토큰이 아닌 관리되는 개체 배열의 개체를 나타냅니다.
DumpLock [--allthreads] [--waits] 스레드(기본값) 또는 스레드에서 대기 중인 개체와 같은 System.Threading.Lock 개체에 대한 정보를 표시합니다.
DumpLog [-addr<addressOfStressLog>] [<Filename>] 메모리 내 스트레스 로그의 내용을 지정된 파일에 씁니다. 이름을 지정하지 않으면 이 명령은 현재 디렉터리에 StressLog.txt 파일을 만듭니다.

메모리 내 스트레스 로그를 사용하면 잠금 또는 I/O를 사용하지 않고 스트레스 오류를 진단할 수 있습니다. 스트레스 로그를 사용하도록 설정하려면 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework다음 레지스트리 키를 설정합니다.

(DWORD) StressLog = 1

(DWORD) LogFacility = 0xffffffff

(DWORD) StressLogSize = 65536

선택적 -addr 옵션을 사용하면 기본 로그 이외의 스트레스 로그를 지정할 수 있습니다.

네이티브 AOT 애플리케이션에 대해 지원됩니다.
DumpMD<MethodDesc 주소> 지정된 주소에 MethodDesc 구조체에 대한 정보를 표시합니다.

IP2MD 명령을 사용하여 관리되는 함수에서 MethodDesc 구조체 주소를 가져올 수 있습니다.
DumpMT [-MD] <MethodTable 주소> 지정된 주소의 메서드 테이블에 대한 정보를 표시합니다. -MD 옵션을 지정하면 개체로 정의된 모든 메서드 목록이 표시됩니다.

관리되는 각 개체에는 메서드 테이블 포인터가 포함됩니다.
DumpModule [-mt] <모듈 주소> 지정된 주소에 모듈에 대한 정보를 표시합니다. -mt 옵션은 모듈에 정의된 형식과 모듈에서 참조하는 형식을 표시합니다.

DumpDomain 사용하거나 DumpAssembly 명령을 모듈의 주소를 검색할 수 있습니다.
DumpObj [-nofields] <개체 주소>

-또는-

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

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

개체이기 때문에 CLASS 형식의 필드에서 DumpObj 명령을 실행할 수 있습니다.

- nofields 옵션은 개체의 필드가 표시되지 않도록 하며 String과 같은 개체에 유용합니다.
dumpRuntimeTypes 가비지 수집기 힙에 런타임 형식 개체를 표시하고 연결된 형식 이름 및 메서드 테이블을 나열합니다.
DumpStack [-EE] [-n] [top스택 [bottom스택]] 스택 추적을 표시합니다.

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

-n 옵션은 원본 파일 이름 및 줄 번호 표시를 사용하지 않도록 설정합니다. 디버거에 SYMOPT_LOAD_LINES 옵션이 지정된 경우 SOS는 관리되는 모든 프레임에 대한 기호를 조회하고 성공하면 해당 원본 파일 이름과 줄 번호를 표시합니다. 이 동작을 사용하지 않도록 설정하려면 -n(줄 번호 없음) 매개 변수를 지정할 수 있습니다.
DumpSig<sigaddr><moduleaddr> 지정된 주소에 Sig 구조체에 대한 정보를 표시합니다.
DumpSigElem<sigaddr><moduleaddr> 서명 개체의 단일 요소를 표시합니다. 대부분의 경우 DumpSig 사용하여 개별 서명 개체를 확인해야 합니다. 그러나 서명이 어떤 식으로든 손상된 경우 DumpSigElem 사용하여 유효한 부분을 읽을 수 있습니다.
DumpStackObjects [-verify] [topstack [bottomstack]]

-또는-

DSO [-verify] [topstack [bottomstack]]
현재 스택의 범위 내에 있는 관리되는 모든 개체를 표시합니다.

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

clrstack 명령과 함께 K(windbg) 또는 bt(lldb)와 같은 스택 추적 명령과 함께 DumpStackObject 명령을 사용하여 지역 변수 및 매개 변수의 값을 확인합니다.
DumpVC<MethodTable 주소><주소> 지정된 주소에 있는 값 클래스의 필드에 대한 정보를 표시합니다.

MethodTable 매개 변수를 사용하면 DumpVC 명령이 필드를 올바르게 해석할 수 있습니다. 값 클래스에는 메서드 테이블이 첫 번째 필드로 없습니다.
EEHeap [-gc] [-loader] 내부 런타임 데이터 구조에서 사용하는 프로세스 메모리에 대한 정보를 표시합니다.

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

가비지 수집기의 정보는 관리되는 힙에 있는 각 세그먼트의 범위를 나열합니다. 포인터가 -gc지정된 세그먼트 범위 내에 있으면 포인터는 개체 포인터입니다.
EEStack [-short] [-EE] 프로세스의 모든 스레드에서 DumpStack 명령을 실행합니다.

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

잠금을 수행한 스레드입니다.

가비지 수집을 허용하기 위해 중단된 스레드입니다.

현재 관리 코드에 있는 스레드입니다.
EHInfo [<MethodDesc address>] [<Code address>] 지정된 메서드의 예외 처리 블록을 표시합니다. 이 명령은 절 블록(try 블록) 및 처리기 블록(catch 블록)의 코드 주소와 오프셋을 표시합니다.
FAQ 질문과 대답을 표시합니다. dotnet-dump지원되지 않습니다.
FinalizeQueue [-detail] | [-allReady] [-short] 완료를 위해 등록된 모든 개체를 표시합니다.

-detail 옵션은 정리해야 하는 SyncBlocks 및 정리를 기다리는 모든 RuntimeCallableWrappers(RCW)에 대한 추가 정보를 표시합니다. 이러한 두 데이터 구조는 실행될 때 종료자 스레드에 의해 캐시되고 정리됩니다.

-allReady 옵션은 가비지 수집으로 이미 표시되어 있는지 또는 다음 가비지 수집으로 표시되든 관계없이 완료할 준비가 된 모든 개체를 표시합니다. "완료 준비 완료" 목록에 있는 개체는 더 이상 루팅되지 않는 종료 가능한 개체입니다. 이 옵션은 종료 가능한 큐의 모든 개체가 여전히 루팅되었는지 여부를 확인하므로 비용이 많이 들 수 있습니다.

-short 옵션은 출력을 각 개체의 주소로 제한합니다. -allReady함께 사용되는 경우 더 이상 루팅되지 않는 종료자가 있는 모든 개체를 열거합니다. 독립적으로 사용되는 경우 종료 가능한 "완료 준비" 큐의 모든 개체를 나열합니다.
FindAppDomain개체 주소 지정된 주소에서 개체의 애플리케이션 도메인을 결정합니다.
FindRoots-genN | -gen 모든 | 개체 주소 지정된 생성의 다음 컬렉션에서 디버기에서 디버거가 중단되도록 합니다. 중단이 발생하는 즉시 효과가 다시 설정됩니다. 다음 컬렉션을 중단하려면 명령을 다시 실행해야 합니다. 이 명령의 <개체 주소> 형식은 -gen 또는 -gen으로 인해 중단된 후 발생한 후에 사용됩니다. 이때 디버기는 FindRoots 현재 비난된 세대의 개체에 대한 루트를 식별하는 데 적합한 상태입니다. Windows에서만 지원됩니다.
GCHandles [-perdomain] 프로세스의 가비지 수집기 핸들에 대한 통계를 표시합니다.

-perdomain 옵션은 애플리케이션 도메인별로 통계를 정렬합니다.

GCHandles 명령을 사용하여 가비지 수집기 핸들 누수로 인한 메모리 누수를 찾습니다. 예를 들어 강력한 가비지 수집기 핸들이 여전히 이를 가리키고 핸들을 해제하지 않고 삭제되므로 코드가 큰 배열을 유지할 때 메모리 누수가 발생합니다.

Windows에서만 지원됩니다.
GCHandleLeaks 메모리에서 프로세스의 강력하고 고정된 가비지 수집기 핸들에 대한 참조를 검색하고 결과를 표시합니다. 핸들이 발견되면 GCHandleLeaks 명령에 참조 주소가 표시됩니다. 메모리에서 핸들을 찾을 수 없는 경우 이 명령은 알림을 표시합니다. Windows에서만 지원됩니다.
GCInfo<MethodDesc 주소><코드 주소> 레지스터 또는 스택 위치에 관리되는 개체가 포함된 경우를 나타내는 데이터를 표시합니다. 가비지 수집이 발생하는 경우 수집기는 개체에 대한 참조 위치를 알고 있어야 새 개체 포인터 값으로 업데이트할 수 있습니다.
GCRoot [-nostacks] [-all] <개체 주소> 지정된 주소에서 개체에 대한 참조(또는 루트)에 대한 정보를 표시합니다.

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

이 명령은 스택 루트가 유효한지 아니면 삭제되는지를 결정하지 않습니다. clrstackU 명령을 사용하여 스택 루트가 아직 사용 중인지 확인하기 위해 로컬 또는 인수 값이 속한 프레임을 디스어셈블합니다.

-nostacks 옵션은 검색을 가비지 수집기 핸들 및 도달 가능한 개체로 제한합니다.

-all 옵션은 고유한 루트가 아닌 모든 루트를 표시하도록 합니다.
GCWhere<개체 주소> 전달된 인수의 가비지 수집 힙에서 위치와 크기를 표시합니다. 인수가 관리되는 힙에 있지만 유효한 개체 주소가 아닌 경우 크기는 0으로 표시됩니다.
도움말 (soshelp) [<명령>] [faq] 매개 변수가 지정되지 않은 경우 사용 가능한 모든 명령을 표시하거나 지정된 명령에 대한 자세한 도움말 정보를 표시합니다.

faq 매개 변수는 자주 묻는 질문에 대한 답변을 표시합니다.
HeapStat [-inclUnrooted | -iu] 각 힙의 생성 크기 및 각 힙의 각 세대에 있는 총 사용 가능한 공간을 표시합니다. -inclUnrooted 옵션이 지정된 경우 보고서에는 더 이상 루팅되지 않는 가비지 수집 힙의 관리되는 개체에 대한 정보가 포함됩니다. Windows에서만 지원됩니다.
히스클레어 Hist 명령 제품군에서 사용하는 모든 리소스를 해제합니다.

일반적으로 각 HistInit 이전 리소스를 정리하기 때문에 HistClear명시적으로 호출할 필요가 없습니다.
HistInit 디버기에서 저장된 스트레스 로그에서 SOS 구조를 초기화합니다.
HistObj<obj_address> 모든 스트레스 로그 재배치 레코드를 검사하고 인수로 전달된 주소로 이어졌을 수 있는 가비지 수집 재배치 체인을 표시합니다.
HistObjFind<obj_address> 지정된 주소에서 개체를 참조하는 모든 로그 항목을 표시합니다.
HistRoot<루트> 지정된 루트의 승격 및 재배치와 관련된 정보를 표시합니다.

루트 값을 사용하여 가비지 수집을 통해 개체의 움직임을 추적할 수 있습니다.
IP2MD(ip2md) <코드 주소> JIT 컴파일된 코드의 지정된 주소에 MethodDesc 구조를 표시합니다.
ListNearObj(lno) <obj_address> 지정한 주소 앞과 다음 개체를 표시합니다. 이 명령은 가비지 수집 힙에서 유효한 메서드 테이블 기반 관리 개체의 유효한 시작 부분과 인수 주소 다음에 있는 개체를 찾습니다. Windows에서만 지원됩니다.
MinidumpMode [0] [1] 미니덤프를 사용할 때 안전하지 않은 명령을 실행하지 않도록 합니다.

0 전달하여 이 기능을 사용하지 않도록 설정하거나 1 이 기능을 사용하도록 설정합니다. 기본적으로 MinidumpMode 값은 0설정됩니다.

.dump /m 명령 또는 .dump 명령으로 만든 미니덤프는 CLR 관련 데이터가 제한되어 있으므로 SOS 명령의 하위 집합만 올바르게 실행할 수 있습니다. 필요한 메모리 영역이 매핑되지 않거나 부분적으로만 매핑되므로 일부 명령은 예기치 않은 오류로 인해 실패할 수 있습니다. 이 옵션은 미니덤프에 대해 안전하지 않은 명령을 실행하지 않도록 보호합니다.

Windbg에서만 지원합니다.
Name2EE(name2ee) <모듈 이름><형식 또는 메서드 이름>

-또는-

Name2EE<모듈 이름>!<형식 또는 메서드 이름>
지정된 모듈에서 지정된 형식 또는 메서드의 MethodTable 구조체 및 EEClass 구조를 표시합니다.

지정된 모듈을 프로세스에 로드해야 합니다.

적절한 형식 이름을 얻으려면 Ildasm.exe(IL 디스어셈블러)사용하여 모듈을 찾습니다. * 모듈 이름 매개 변수로 전달하여 로드된 모든 관리되는 모듈을 검색할 수도 있습니다. 모듈 이름 매개 변수는 mscorlib 또는 image00400000같은 모듈의 디버거 이름일 수도 있습니다.

이 명령은 <module>!<type>Windows 디버거 구문을 지원합니다. 형식은 정규화되어야 합니다.
ObjSize [<개체 주소>] | [-aggregate] [-stat] 지정된 개체의 크기를 표시합니다. 매개 변수를 지정하지 않으면 ObjSize 명령은 관리되는 스레드에 있는 모든 개체의 크기를 표시하고, 프로세스의 모든 가비지 수집기 핸들을 표시하며, 해당 핸들이 가리키는 개체의 크기를 합한 값입니다. ObjSize 명령에는 부모 외에 모든 자식 개체의 크기가 포함됩니다.

-aggregate 옵션은 -stat 인수와 함께 사용하여 여전히 루팅된 형식에 대한 자세한 보기를 가져올 수 있습니다. !dumpheap -stat!objsize -aggregate -stat사용하면 더 이상 루팅되지 않는 개체를 확인하고 다양한 메모리 문제를 진단할 수 있습니다.

Windows에서만 지원됩니다.
PrintException [-nested] [-lines] [<Exception 개체 주소>]

-또는-

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

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

옵션은 사용 가능한 경우 원본 정보를 표시합니다.

이 명령을 사용하여 이진 배열인 _stackTrace 필드의 서식을 지정하고 볼 수 있습니다.
ProcInfo [-env] [-time] [-mem] 프로세스, 커널 CPU 시간 및 메모리 사용량 통계에 대한 환경 변수를 표시합니다. Windbg에서만 지원합니다.
RCWCleanupList<RCWCleanupList 주소> 정리를 기다리는 지정된 주소에 런타임 호출 가능 래퍼 목록을 표시합니다. Windbg에서만 지원합니다.
SaveModule기본 주소Filename 지정된 주소의 메모리에 로드되는 이미지를 지정된 파일에 씁니다. Windbg에서만 지원합니다.
setHostRuntime [runtime-directory] 이 명령은 LLDB(디버거)에서 SOS의 일부로 실행되는 관리 코드를 호스트하는 데 사용할 .NET 런타임의 경로를 설정합니다. 런타임은 버전 2.1.0 이상이어야 합니다. 디렉터리에 공백이 있는 경우 작은따옴표(')여야 합니다.

일반적으로 SOS는 관리 코드를 자동으로 실행하기 위해 설치된 .NET 런타임을 찾으려고 시도하지만 실패할 경우 이 명령을 사용할 수 있습니다. 기본값은 디버그되는 동일한 런타임(libcoreclr)을 사용하는 것입니다. 디버그 중인 기본 런타임이 SOS 코드를 실행할 만큼 충분히 작동하지 않거나 버전이 2.1.0보다 작은 경우 이 명령을 사용합니다.

SOS 명령을 실행할 때 다음 오류 메시지가 표시되면 이 명령을 사용하여 경로를 2.1.0 이상으로 설정합니다.

(lldb) clrstack
Error: Fail to initialize CoreCLR 80004005 ClrStack failed

(lldb) sethostruntime /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.6

명령 셸에서 "dotnet --info"를 사용하여 설치된 .NET 런타임의 경로를 찾을 수 있습니다.
SetSymbolServer [-ms] [-disable] [-log] [-loadsymbols] [-cachecache-path] [-directorysearch-directory] [-sympathwindows-symbol-path] [symbol-server-URL] 기호 서버 다운로드 지원을 사용하도록 설정합니다.

-ms 옵션을 사용하면 공용 Microsoft 기호 서버에서 다운로드할 수 있습니다.

-disable 옵션은 기호 다운로드 지원을 켭니다.

-cache<캐시 경로> 옵션은 기호 캐시 디렉터리를 지정합니다. 지정하지 않으면 기본값은 $HOME/.dotnet/symbolcache입니다.

-directory 옵션은 기호를 검색하는 경로를 추가합니다. 둘 이상일 수 있습니다.

-sympath 옵션은 서버, 캐시 및 디렉터리 경로를 Windows 기호 경로 형식으로 추가합니다.

-log 옵션을 사용하면 기호 다운로드 로깅을 사용할 수 있습니다.

-loadsymbols 옵션은 런타임에 대한 네이티브 .NET 기호를 다운로드하려고 시도합니다. lldb 및 dotnet-dump에서 지원됩니다.
SOSFlush 내부 SOS 캐시를 플러시합니다.
SOSStatus [-reset] 내부 SOS 상태를 표시하거나 내부 캐시된 상태를 다시 설정합니다.
StopOnException [-derived] [-create | -create2] <Exception><의사 레지스터 번호> 지정된 예외가 throw될 때 디버거가 중지되지만 다른 예외가 throw될 때 계속 실행되도록 합니다.

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

Windbg에서만 지원합니다.
SyncBlk [-all | <syncblk number>] 지정된 SyncBlock 구조체 또는 모든 SyncBlock 구조를 표시합니다. 인수를 전달하지 않으면 SyncBlk 명령은 스레드가 소유한 개체에 해당하는 SyncBlock 구조를 표시합니다.

SyncBlock 구조체는 모든 개체에 대해 만들 필요가 없는 추가 정보를 위한 컨테이너입니다. COM interop 데이터, 해시 코드 및 스레드로부터 안전한 작업에 대한 잠금 정보를 보유할 수 있습니다.
threadPool 큐의 작업 요청 수, 완료 포트 스레드 수 및 타이머 수를 포함하여 관리되는 스레드 풀에 대한 정보를 표시합니다.
스레드(clrthreads) [-live] [-special] 프로세스의 모든 관리되는 스레드를 표시합니다.

Threads 명령은 디버거 약식 ID, CLR 스레드 ID 및 운영 체제 스레드 ID를 표시합니다. 또한 Threads 명령은 스레드가 실행 중인 애플리케이션 도메인을 나타내는 도메인 열, COM 아파트 모드를 표시하는 APT 열 및 스레드에서 throw된 마지막 예외를 표시하는 예외 열을 표시합니다.

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

-special 옵션은 CLR에서 만든 모든 특수 스레드를 표시합니다. 특수 스레드에는 가비지 수집 스레드(동시 및 서버 가비지 수집), 디버거 도우미 스레드, 종료자 스레드, AppDomain 언로드 스레드 및 스레드 풀 타이머 스레드가 포함됩니다.

네이티브 AOT 애플리케이션에 대해 지원됩니다.
ThreadState <상태 값 필드> 스레드의 상태를 표시합니다. value 매개 변수는 Threads 보고서 출력의 State 필드 값입니다.
Token2EE<모듈 이름><토큰> 지정된 모듈의 지정된 메타데이터 토큰을 MethodTable 구조체 또는 MethodDesc 구조체로 바꿉니다.

모듈 이름 매개 변수에 대한 * 전달하여 로드된 모든 관리되는 모듈에서 해당 토큰이 매핑되는 항목을 찾을 수 있습니다. 모듈의 디버거 이름(예: mscorlib 또는 image00400000)을 전달할 수도 있습니다.
U [-gcinfo] [-ehinfo] [-n] <MethodDesc 주소> | <코드 주소> 메서드에 대한 MethodDesc 구조 포인터 또는 메서드 본문 내의 코드 주소로 지정된 관리되는 메서드의 주석이 추가된 디스어셈블리를 표시합니다. U 명령은 메타데이터 토큰을 이름으로 변환하는 주석과 함께 처음부터 끝까지 전체 메서드를 표시합니다.

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

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

-n 옵션은 원본 파일 이름 및 줄 번호 표시를 사용하지 않도록 설정합니다. 디버거에 SYMOPT_LOAD_LINES 옵션이 지정된 경우 SOS는 관리되는 모든 프레임에 대한 기호를 조회하고 성공하면 해당 소스 파일 이름과 줄 번호를 표시합니다. -n 옵션을 지정하여 이 동작을 사용하지 않도록 설정할 수 있습니다.
VerifyHeap 가비지 수집기 힙에서 손상의 징후를 확인하고 발견된 오류를 표시합니다.

힙 손상은 잘못 생성된 플랫폼 호출로 인해 발생할 수 있습니다.

네이티브 AOT 애플리케이션에 대해 지원됩니다.
VerifyObj개체 주소 인수로 전달된 개체를 검사하여 손상의 징후를 확인합니다. Windows에서만 지원됩니다.
VMMap 가상 주소 공간을 트래버스하고 각 지역에 적용되는 보호 유형을 표시합니다. Windbg에서만 지원합니다.
VMStat 해당 메모리에 적용된 각 보호 유형(무료, 예약됨, 커밋됨, 프라이빗, 매핑된 이미지)에 따라 정렬된 가상 주소 공간의 요약 보기를 제공합니다. TOTAL 열은 BLK COUNT 열을 곱한 AVERAGE 열의 결과를 표시합니다. Windbg에서만 지원합니다.

Windows 디버거

또한 .NET 디버거 확장을 WinDbg/dbg 디버거 로드하고 Windows 디버거 내에서 명령을 실행하여 사용할 수 있습니다. 이 명령은 라이브 프로세스 또는 덤프에서 사용할 수 있습니다.

Windbg는 디버그되는 프로세스에 .NET 런타임(coreclr.dll 또는 libcoreclr.so)이 포함될 때마다 확장을 자동으로 로드해야 합니다.

LLDB 디버거

LLDB용 .NET 디버거 확장을 구성하는 방법에 대한 지침은 dotnet-debugger-extensions참조하세요. 이 명령은 라이브 프로세스 또는 덤프에서 사용할 수 있습니다.

기본적으로 다음을 입력하여 모든 명령에 연결할 수 있습니다. sos [command_name]. 그러나 일반적인 명령은 sos 접두사를 필요로 하지 않도록 별칭이 지정되었습니다.

명령 기능
analyzeoom GC 힙에 대한 할당 요청에서 발생한 마지막 OOM의 정보를 표시합니다.
bpmd 지정된 모듈의 지정된 관리 메서드에 중단점을 만듭니다.
clrmodules 프로세스의 관리되는 모듈을 나열합니다.
clrstack 관리 코드의 스택 추적만 제공합니다.
clrthreads 실행 중인 관리되는 스레드를 나열합니다.
clru 관리되는 메서드의 주석이 추가된 디스어셈블리를 표시합니다.
dbgout 내부 SOS 로깅을 사용하거나 사용하지 않도록 설정(-off)합니다.
dso 현재 스택의 범위 내에 있는 관리되는 모든 개체를 표시합니다.
dumpalc 지정된 개체가 로드되는 수집 가능한 AssemblyLoadContext에 대한 세부 정보를 표시합니다.
dumparray 관리되는 배열에 대한 세부 정보를 표시합니다.
dumpasync 가비지 수집 힙의 비동기 상태 컴퓨터에 대한 정보를 표시합니다.
dumpassembly 어셈블리에 대한 세부 정보를 표시합니다.
dumpclass 지정된 주소에 EEClass 구조체에 대한 정보를 표시합니다.
dumpconcurrentdictionary 동시 사전 콘텐츠를 표시합니다.
dumpconcurrentqueue 동시 큐 콘텐츠를 표시합니다.
dumpdelegate 대리자 정보를 표시합니다.
dumpdomain 모든 AppDomains 또는 지정된 어셈블리 내의 모든 어셈블리에 대한 정보를 표시합니다.
dumpgcdata GC 데이터에 대한 정보를 표시합니다.
dumpgen 지정된 생성에 대한 힙 콘텐츠를 표시합니다.
dumpheap 가비지 수집 힙 및 개체에 대한 컬렉션 통계에 대한 정보를 표시합니다.
dumpil 관리되는 메서드와 연결된 CIL(공용 중간 언어)을 표시합니다.
dumplock 스레드(기본값) 또는 스레드에서 대기 중인 개체와 같은 System.Threading.Lock 개체에 대한 정보를 표시합니다. 이 명령은 .NET 디버거 확장에서만 사용할 수.
dumplog 메모리 내 스트레스 로그의 내용을 지정된 파일에 씁니다.
dumpmd 지정된 주소에 MethodDesc 구조체에 대한 정보를 표시합니다.
dumpmodule 지정된 주소에 모듈에 대한 정보를 표시합니다.
dumpmt 지정된 주소에 메서드 테이블에 대한 정보를 표시합니다.
dumpobj 지정된 주소에 개체 정보를 표시합니다.
dumpruntimetypes GC 힙에서 모든 System.RuntimeType 개체를 찾아서 참조하는 형식 이름과 MethodTable도 출력합니다.
dumpsig <sigaddr> <moduleaddr>지정한 메서드 또는 필드의 서명을 덤프합니다.
dumpsigelem 서명 개체의 단일 요소를 덤프합니다.
dumpstack 네이티브 및 관리형 스택 추적을 표시합니다.
dumpstackobjects 현재 스택의 범위 내에 있는 관리되는 모든 개체를 표시합니다.
dumpvc 값 클래스의 필드에 대한 정보를 표시합니다.
eeheap 내부 런타임 데이터 구조에서 사용하는 프로세스 메모리에 대한 정보를 표시합니다.
eestack 프로세스의 모든 스레드에서 dumpstack 실행합니다.
eeversion 런타임 및 SOS 버전에 대한 정보를 표시합니다.
ehinfo JIT-ed 메서드의 예외 처리 블록을 표시합니다.
finalizequeue 완료를 위해 등록된 모든 개체를 표시합니다.
findappdomain GC 개체의 AppDomain을 확인하려고 시도합니다.
findroots GC 컬렉션에서 개체 루트를 찾아 표시합니다.
gchandles 프로세스의 가비지 수집기 핸들에 대한 통계를 표시합니다.
gcheapstat 가비지 수집기 통계를 표시합니다.
gcinfo 메서드에 대한 JIT GC 인코딩을 표시합니다.
gcroot 지정된 주소에서 개체에 대한 참조(또는 루트)에 대한 정보를 표시합니다.
gcwhere 지정된 주소의 GC 힙에 있는 위치를 표시합니다.
histclear Hist 명령 제품군에서 사용하는 모든 리소스를 해제합니다.
histinit 디버기에서 저장된 스트레스 로그에서 SOS 구조를 초기화합니다.
histobj 모든 스트레스 로그 재배치 레코드를 검사하고 인수로 전달된 주소로 이어졌을 수 있는 가비지 수집 재배치 체인을 표시합니다.
histobjfind 지정된 주소에서 개체를 참조하는 모든 로그 항목을 표시합니다.
histroot 지정된 루트의 승격 및 재배치와 관련된 정보를 표시합니다.
histstats 스트레스 로그 통계를 표시합니다.
ip2md JIT 컴파일된 코드의 지정된 주소에 MethodDesc 구조를 표시합니다.
listnearobj 지정한 주소 앞과 뒤에 오는 개체를 표시합니다.
loadsymbols .NET 네이티브 모듈 기호를 로드합니다.
logging 내부 SOS 로깅을 사용하거나 사용하지 않도록 설정합니다.
name2ee 지정된 모듈의 지정된 형식 또는 메서드에 대한 MethodTableEEClass 구조를 표시합니다.
objsize 지정된 개체의 크기를 표시합니다.
parallelstacks Visual Studio '병렬 스택' 패널과 비슷하게 병합된 스레드 스택을 표시합니다.
pathto <root> <target>GC 경로를 표시합니다.
pe 지정된 주소의 Exception 클래스에서 파생된 개체의 필드를 표시하고 서식을 지정합니다.
printexception 지정된 주소의 Exception 클래스에서 파생된 개체의 필드를 표시하고 서식을 지정합니다.
runtimes 대상의 런타임을 나열하거나 기본 런타임을 변경합니다.
stoponcatch 대상 프로세스는 다음에 실행 중에 관리되는 예외가 catch될 때 중단됩니다.
setclrpath coreclr dac/dbi 파일을 로드하는 경로를 설정합니다. setclrpath <path>.
sethostruntime SOS에서 관리 코드를 실행하는 데 사용할 .NET 런타임 디렉터리를 설정하거나 표시합니다.
setsymbolserver 기호 서버 지원을 사용하도록 설정합니다.
setsostid LLDB에서 제공하는 것을 사용하는 대신 현재 OS tid/스레드 인덱스 설정 setsostid <tid> <index>.
sos 다양한 coreclr 디버깅 명령을 실행합니다. 구문 sos <command-name> <args>사용합니다. 자세한 내용은 'soshelp'을 참조하세요.
soshelp 매개 변수가 지정되지 않은 경우 사용 가능한 모든 명령을 표시하거나 지정된 명령에 대한 자세한 도움말 정보를 표시합니다. soshelp <command>.
syncblk SyncBlock 홀더 정보를 표시합니다.
taskstate 사람이 읽을 수 있는 형식으로 작업 상태를 표시합니다.
threadpool 런타임 스레드 풀에 대한 정보를 표시합니다.
threadpoolqueue 대기 중인 스레드 풀 작업 항목을 표시합니다.
threadstate 스레드 상태의 의미를 꽤 인쇄합니다.
timerinfo 실행 중인 타이머에 대한 정보를 표시합니다.
token2ee 지정된 토큰 및 모듈에 대한 MethodTable 구조 및 MethodDesc 구조를 표시합니다.
traverseheap CLR Profiler에서 이해하는 형식으로 파일에 힙 정보를 씁니다.
verifyheap GC 힙에서 손상의 징후를 확인합니다.
verifyobj 인수로 전달된 개체를 검사하여 손상의 징후를 확인합니다.

Windbg/cdb 예제 사용

명령 묘사
!dumparray -start 2 -length 5 -details 00ad28d0 주소 00ad28d0배열의 내용을 표시합니다. 표시는 두 번째 요소에서 시작하여 5개 요소에 대해 계속됩니다.
!dumpassembly 1ca248 주소 1ca248어셈블리의 내용을 표시합니다.
!dumpheap 가비지 수집기 힙에 대한 정보를 표시합니다.
!DumpLog 메모리 내 스트레스 로그의 내용을 현재 디렉터리의 StressLog.txt(기본값) 파일에 씁니다.
!dumpmd 902f40 주소 902f40MethodDesc 구조를 표시합니다.
!dumpmodule 1caa50 주소 1caa50모듈에 대한 정보를 표시합니다.
!DumpObj a79d40 주소 a79d40개체에 대한 정보를 표시합니다.
!DumpVC 0090320c 00a79d9c 주소 0090320c메서드 테이블을 사용하여 주소 00a79d9c 값 클래스의 필드를 표시합니다.
!eeheap -gc 가비지 수집기에서 사용하는 프로세스 메모리를 표시합니다.
!finalizequeue 종료를 위해 예약된 모든 개체를 표시합니다.
!findappdomain 00a79d98 주소 00a79d98개체의 애플리케이션 도메인을 결정합니다.
!gcinfo 5b68dbb8 현재 프로세스의 모든 가비지 수집기 핸들을 표시합니다.
!name2ee unittest.exe MainClass.Main 모듈 unittest.exe클래스 MainClassMain 메서드에 대한 MethodTableEEClass 구조를 표시합니다.
!token2ee unittest.exe 02000003 모듈 unittest.exe주소 02000003 메타데이터 토큰에 대한 정보를 표시합니다.

LLDB 사용 예제

명령 묘사
dumparray -start 2 -length 5 -details 00ad28d0 주소 00ad28d0배열의 내용을 표시합니다. 표시는 두 번째 요소에서 시작하여 5개 요소에 대해 계속됩니다.
dumpassembly 1ca248 주소 1ca248어셈블리의 내용을 표시합니다.
dumpheap 가비지 수집기 힙에 대한 정보를 표시합니다.
dumplog 메모리 내 스트레스 로그의 내용을 현재 디렉터리의 StressLog.txt(기본값) 파일에 씁니다.
dumpmd 902f40 주소 902f40MethodDesc 구조를 표시합니다.
dumpmodule 1caa50 주소 1caa50모듈에 대한 정보를 표시합니다.
dumpobj a79d40 주소 a79d40개체에 대한 정보를 표시합니다.
dumpvc 0090320c 00a79d9c 주소 0090320c메서드 테이블을 사용하여 주소 00a79d9c 값 클래스의 필드를 표시합니다.
eeheap -gc 가비지 수집기에서 사용하는 프로세스 메모리를 표시합니다.
findappdomain 00a79d98 주소 00a79d98개체의 애플리케이션 도메인을 결정합니다.
gcinfo 5b68dbb8 현재 프로세스의 모든 가비지 수집기 핸들을 표시합니다.
name2ee unittest.exe MainClass.Main 모듈 unittest.exe클래스 MainClassMain 메서드에 대한 MethodTableEEClass 구조를 표시합니다.
token2ee unittest.exe 02000003 모듈 unittest.exe주소 02000003 메타데이터 토큰에 대한 정보를 표시합니다.
clrthreads 관리되는 스레드를 표시합니다.

참고 항목