덤프 수집 및 분석 유틸리티(dotnet-dump)

이 문서 적용 대상: ✔️ dotnet-dump 버전 3.0.47001 이상 버전

참고 항목

macOS용 dotnet-dump는 .NET 5 이상 버전에서만 지원됩니다.

설치

다음 두 가지 방법으로 dotnet-dump를 다운로드하고 설치할 수 있습니다.

참고 항목

x86 앱에서 dotnet-dump를 사용하려면 해당하는 x86 버전의 도구가 필요합니다.

개요

dotnet-dump [-h|--help] [--version] <command>

설명

dotnet-dump 전역 도구를 활용하면 네이티브 디버거 없이 Windows, Linux 및 macOS에서 덤프를 수집하고 분석할 수 있습니다. 이 도구는 완벽하게 작동하는 lldb를 사용할 수 없는 Alpine Linux와 같은 플랫폼에서 중요합니다. dotnet-dump 도구를 사용하면 충돌 및 GC(가비지 수집기)를 분석하기 위해 SOS 명령을 실행할 수 있지만 네이티브 디버거가 아니므로 네이티브 스택 프레임 표시와 같은 기능은 지원되지 않습니다.

옵션

  • --version

    dotnet-dump 유틸리티의 버전을 표시합니다.

  • -h|--help

    명령줄 도움말을 표시합니다.

명령

명령
dotnet-dump collect
dotnet-dump analyze
dotnet-dump ps

dotnet-dump collect

프로세스에서 덤프를 캡처합니다.

개요

dotnet-dump collect [-h|--help] [-p|--process-id] [-n|--name] [--type] [-o|--output] [--diag] [--crashreport]

옵션

  • -h|--help

    명령줄 도움말을 표시합니다.

  • -p|--process-id <PID>

    덤프를 수집할 프로세스 ID 번호를 지정합니다.

  • -n|--name <name>

    덤프를 수집할 프로세스의 이름을 지정합니다.

  • --type <Full|Heap|Mini>

    프로세스에서 수집되는 정보의 종류를 결정하는 덤프 형식을 지정합니다. 다음 세 가지 유형이 있습니다.

    • Full - 모듈 이미지를 포함하여 모든 메모리를 포함하는 가장 큰 덤프입니다.
    • Heap - 모듈 목록, 스레드 목록, 모든 스택, 예외 정보, 핸들 정보 및 매핑된 이미지를 제외한 모든 메모리를 포함하는 크고 비교적 포괄적인 덤프입니다.
    • Mini - 모듈 목록, 스레드 목록, 예외 정보 및 모든 스택을 포함하는 작은 덤프입니다.

    지정하지 않으면 Full이 기본값입니다.

  • -o|--output <output_dump_path>

    수집된 덤프를 기록해야 하는 전체 경로 및 파일 이름입니다. dotnet 프로세스가 실행 중인 사용자에게 지정된 디렉터리에 대한 쓰기 권한이 있는지 확인합니다.

    지정하지 않으면 다음과 같이 설정됩니다.

    • Windows의 경우 기본적으로 .\dump_YYYYMMDD_HHMMSS.dmp로 설정됩니다.
    • Linux 및 macOS의 경우 기본적으로 ./core_YYYYMMDD_HHMMSS로 설정됩니다.

    YYYYMMDD는 년/월/일이고, HHMMSS는 시간/분/초입니다.

  • --diag

    덤프 수집 진단 로깅을 사용하도록 설정합니다.

  • --crashreport

    크래시 보고서 생성을 사용하도록 설정합니다.

참고 항목

Linux 및 macOS에서 해당 명령은 대상 애플리케이션 및 dotnet-dump가 동일한 TMPDIR 환경 변수를 공유할 것으로 예상합니다. 그러지 않으면 명령 시간이 초과됩니다.

참고 항목

dotnet-dump를 사용하여 덤프를 수집하려면 대상 프로세스를 실행하는 사용자와 동일한 사용자 또는 루트로 실행해야 합니다. 그러지 않으면 도구는 대상 프로세스와 연결을 설정하지 못합니다.

dotnet-dump analyze

덤프를 검색하기 위해 대화형 셸을 시작합니다. 셸에는 다양한 SOS 명령이 허용됩니다.

개요

dotnet-dump analyze <dump_path> [-h|--help] [-c|--command]

인수

  • <dump_path>

    분석할 덤프 파일의 경로를 지정합니다.

옵션

  • -c|--command <debug_command>

    시작 시 명령을 실행합니다. 이 매개 변수의 여러 인스턴스를 호출에서 명령을 연결하는 데 사용할 수 있습니다. 명령은 명령줄에서 제공되는 순서대로 실행됩니다. 명령 실행 후에 dotnet dump를 종료하려면 마지막 명령은 'exit'여야 합니다.

SOS 명령 분석

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

참고 항목

추가 정보는 .NET용 SOS 디버깅 확장에서 얻을 수 있습니다.

dotnet-dump ps

덤프를 수집할 수 있는 dotnet 프로세스를 나열합니다. dotnet-dump 6.0.320703 이상 버전에서는 사용 가능한 경우 각 프로세스가 시작된 명령줄 인수도 표시합니다.

개요

dotnet-dump ps [-h|--help]

예시

dotnet run --configuration Release 명령을 사용하여 장기 실행 앱을 시작한다고 가정해 보겠습니다. 다른 창에서 dotnet-dump ps 명령을 실행합니다. 표시되는 출력은 다음과 같습니다. 명령줄 인수가 있는 경우 dotnet-dump 버전 6.0.320703 이상을 사용하여 표시됩니다.

> dotnet-dump ps

  21932 dotnet     C:\Program Files\dotnet\dotnet.exe   run --configuration Release
  36656 dotnet     C:\Program Files\dotnet\dotnet.exe

dotnet-dump 사용

첫 번째 단계는 덤프를 수집하는 것입니다. 코어 덤프가 이미 생성된 경우 이 단계를 건너뛸 수 있습니다. 운영 체제 또는 .NET Core 런타임의 기본 제공 dump 생성 기능은 각각 코어 덤프를 만들 수 있습니다.

$ dotnet-dump collect --process-id 1902
Writing minidump to file ./core_20190226_135837
Written 98983936 bytes (24166 pages) to core file
Complete

이제 analyze 명령을 사용하여 코어 덤프를 분석합니다.

$ dotnet-dump analyze ./core_20190226_135850
Loading core dump: ./core_20190226_135850
Ready to process analysis commands. Type 'help' to list available commands or 'help [command]' to get detailed help on a command.
Type 'quit' or 'exit' to exit the session.
>

이 작업을 수행하면 다음과 같은 명령을 허용하는 대화형 세션이 열립니다.

> clrstack
OS Thread Id: 0x573d (0)
    Child SP               IP Call Site
00007FFD28B42C58 00007fb22c1a8ed9 [HelperMethodFrame_PROTECTOBJ: 00007ffd28b42c58] System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean, Boolean)
00007FFD28B42DD0 00007FB1B1334F67 System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo) [/root/coreclr/src/mscorlib/src/System/Reflection/RuntimeMethodInfo.cs @ 472]
00007FFD28B42E20 00007FB1B18D33ED SymbolTestApp.Program.Foo4(System.String) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 54]
00007FFD28B42ED0 00007FB1B18D2FC4 SymbolTestApp.Program.Foo2(Int32, System.String) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 29]
00007FFD28B42F00 00007FB1B18D2F5A SymbolTestApp.Program.Foo1(Int32, System.String) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 24]
00007FFD28B42F30 00007FB1B18D168E SymbolTestApp.Program.Main(System.String[]) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 19]
00007FFD28B43210 00007fb22aa9cedf [GCFrame: 00007ffd28b43210]
00007FFD28B43610 00007fb22aa9cedf [GCFrame: 00007ffd28b43610]

앱을 종료한 처리되지 않은 예외를 보려면 다음을 수행합니다.

> pe -lines
Exception object: 00007fb18c038590
Exception type:   System.Reflection.TargetInvocationException
Message:          Exception has been thrown by the target of an invocation.
InnerException:   System.Exception, Use !PrintException 00007FB18C038368 to see more.
StackTrace (generated):
SP               IP               Function
00007FFD28B42DD0 0000000000000000 System.Private.CoreLib.dll!System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean, Boolean)
00007FFD28B42DD0 00007FB1B1334F67 System.Private.CoreLib.dll!System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo)+0xa7 [/root/coreclr/src/mscorlib/src/System/Reflection/RuntimeMethodInfo.cs @ 472]
00007FFD28B42E20 00007FB1B18D33ED SymbolTestApp.dll!SymbolTestApp.Program.Foo4(System.String)+0x15d [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 54]
00007FFD28B42ED0 00007FB1B18D2FC4 SymbolTestApp.dll!SymbolTestApp.Program.Foo2(Int32, System.String)+0x34 [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 29]
00007FFD28B42F00 00007FB1B18D2F5A SymbolTestApp.dll!SymbolTestApp.Program.Foo1(Int32, System.String)+0x3a [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 24]
00007FFD28B42F30 00007FB1B18D168E SymbolTestApp.dll!SymbolTestApp.Program.Main(System.String[])+0x6e [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 19]

StackTraceString: <none>
HResult: 80131604

덤프 수집 문제 해결

덤프 수집을 사용하려면 프로세스에서 ptrace를 호출할 수 있어야 합니다. 덤프 수집에 문제가 발생하는 경우 실행 중인 환경이 이러한 호출을 제한하도록 구성될 수 있습니다. 일반적인 문제에 대한 문제 해결 팁 및 잠재적 솔루션을 확인하려면 덤프: FAQ를 참조하세요.

참고 항목