관리형 스택 추적 검사(dotnet-stack)
이 문서는 다음에 적용됩니다. ✔️ dotnet-stack
버전 5.0.221401 이상 버전
설치
다음 두 가지 방법으로 dotnet-stack
를 다운로드하고 설치할 수 있습니다.
dotnet 전역 도구:
dotnet-stack
NuGet 패키지의 최신 릴리스 버전을 설치하려면 dotnet tool install 명령을 사용합니다.dotnet tool install --global dotnet-stack
직접 다운로드:
플랫폼에 맞는 도구 실행 파일을 다운로드합니다.
OS 플랫폼 Windows x86 | x64 | Arm | Arm-x64 Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64
개요
dotnet-stack [-h, --help] [--version] <command>
설명
dotnet-stack
도구:
- 크로스 플랫폼 .NET Core 도구입니다.
- 대상 .NET 프로세스에서 모든 스레드의 관리형 스택을 캡처하고 인쇄합니다.
- .Net Core 런타임에서 제공하는
EventPipe
추적을 활용합니다.
옵션
-h|--help
명령줄 도움말을 표시합니다.
--version
dotnet-stack 유틸리티의 버전을 표시합니다.
명령
명령 | 설명 |
---|---|
dotnet-stack report | 대상 프로세스에서 각 스레드의 스택 추적을 인쇄합니다. |
dotnet-stack ps | 스택 추적을 수집할 수 있는 dotnet 프로세스를 나열합니다. |
dotnet-stack symbolicate | 스택 추적의 메서드 토큰 및 IL 오프셋에서 줄 번호를 가져옵니다. |
dotnet-stack report
대상 프로세스에서 각 스레드의 스택 추적을 인쇄합니다.
개요
dotnet-stack report -p|--process-id <pid>
-n|--name <process-name>
[-h|--help]
옵션
-n, --name <name>
스택을 보고할 프로세스의 이름입니다.
-p|--process-id <PID>
스택을 보고할 프로세스 ID입니다.
dotnet-stack ps
스택 추적을 수집할 수 있는 dotnet 프로세스를 나열합니다.
dotnet-stack
6.0.320703 이상 버전에서는 사용 가능한 경우 각 프로세스가 시작된 명령줄 인수도 표시합니다.
개요
dotnet-stack ps [-h|--help]
예시
dotnet run --configuration Release
명령을 사용하여 장기 실행 앱을 시작한다고 가정해 보겠습니다. 다른 창에서 dotnet-stack ps
명령을 실행합니다. 표시되는 출력은 다음과 같습니다. 명령줄 인수가 있는 경우 dotnet-stack
버전 6.0.320703 이상을 사용하여 표시됩니다.
> dotnet-stack ps
21932 dotnet C:\Program Files\dotnet\dotnet.exe run --configuration Release
36656 dotnet C:\Program Files\dotnet\dotnet.exe
dotnet-stack symbolicate
스택 추적의 메서드 토큰 및 IL 오프셋에서 줄 번호를 가져옵니다.
개요
dotnet-stack symbolicate <input-path> [-d|--search-dir] [-o|--output] [-c|--stdout] [-h|--help]
옵션
-d, --search-dir <directory1 directory2 ...>
어셈블리 및 pdb가 있는 여러 디렉터리 경로입니다.
-o, --output <output-path>
파일에 직접 출력합니다.
-c, --stdout
콘솔에 직접 출력합니다.
예시
> cat stack.trace
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
at DotnetStackSymbolicate.App.MethodA() in DotnetStackSymbolicate.dll:token 0x6000002+0x6
at DotnetStackSymbolicate.App..ctor() in DotnetStackSymbolicate.dll:token 0x6000003+0x51
at DotnetStackSymbolicate.Program.OnCreate() in DotnetStackSymbolicate.Tizen.dll:token 0x6000001+0x8
onSigabrt called
>
> dotnet-stack symbolicate stack.trace --stdout
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
at DotnetStackSymbolicate.App.MethodA() in C:\DotnetStackSymbolicate\DotnetStackSymbolicate.cs:line 19
at DotnetStackSymbolicate.App..ctor() in C:\DotnetStackSymbolicate\DotnetStackSymbolicate.cs:line 38
at DotnetStackSymbolicate.Program.OnCreate() in C:\DotnetStackSymbolicate.Tizen\DotnetStackSymbolicate.Tizen.cs:line 12
onSigabrt called
Output: stack.trace.symbolicated
dotnet-stack을 사용하여 관리형 스택 보고
dotnet-stack
을 사용하여 관리형 스택을 보고하려면 다음을 수행합니다.
스택을 보고할 .NET Core 애플리케이션의 PID(프로세스 식별자)를 확인합니다.
- 예를 들어, Windows에서 작업 관리자 또는
tasklist
명령을 사용할 수 있습니다. - 예를 들어, Linux에서는
ps
명령입니다. - dotnet-stack ps
- 예를 들어, Windows에서 작업 관리자 또는
다음 명령을 실행합니다.
dotnet-stack report --process-id <PID>
위의 명령은 다음과 유사한 출력을 생성합니다.
Thread (0x48839B): [Native Frames] System.Console!System.IO.StdInReader.ReadKey(bool&) System.Console!System.IO.SyncTextReader.ReadKey(bool&) System.Console!System.ConsolePal.ReadKey(bool) System.Console!System.Console.ReadKey() StackTracee!Tracee.Program.Main(class System.String[])
dotnet-stack
출력의 형식은 다음과 같습니다.- 출력에서 주석은
#
으로 시작합니다. - 각 스레드에는 네이티브 스레드 ID를 포함하는 헤더가 있습니다(
Thread (<thread-id>):
). - 스택 프레임은
Module!Method
형식을 따릅니다. - 비관리 코드로의 전환은 출력에서
[Native Frames]
로 표시됩니다.
# comment Thread (0x1234): module!Method module!Method Thread (0x5678): [Native Frames] Module!Method Module!Method
- 출력에서 주석은
참고 항목
매우 큰 애플리케이션의 경우 프로세스를 중지하는 데 시간이 오래 걸릴 수 있습니다(최대 몇 분). 런타임은 함수 이름을 확인하기 위해 캡처된 모든 관리 코드에 대한 형식 및 메서드 정보를 전송해야 합니다.
다음 단계
.NET