덤프 수집 및 분석 유틸리티(dotnet-dump)
이 문서 적용 대상: ✔️ dotnet-dump
버전 3.0.47001 이상 버전
참고 항목
macOS용 dotnet-dump
는 .NET 5 이상 버전에서만 지원됩니다.
설치
다음 두 가지 방법으로 dotnet-dump
를 다운로드하고 설치할 수 있습니다.
dotnet 전역 도구:
dotnet-dump
NuGet 패키지의 최신 릴리스 버전을 설치하려면 dotnet tool install 명령을 사용합니다.dotnet tool install --global dotnet-dump
직접 다운로드:
플랫폼에 맞는 도구 실행 파일을 다운로드합니다.
OS 플랫폼 Windows x86 | x64 | Arm | Arm-x64 Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64
참고 항목
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 |
지정된 모듈에 있는 지정된 형식 또는 메서드의 MethodTable 및 EEClass 구조체를 표시합니다. |
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를 참조하세요.
참고 항목
.NET