관리형 스택 추적 검사(dotnet-stack)

이 문서는 다음에 적용됩니다. ✔️ dotnet-stack 버전 5.0.221401 이상 버전

설치

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

개요

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
  • 다음 명령을 실행합니다.

    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
    

참고 항목

매우 큰 애플리케이션의 경우 프로세스를 중지하는 데 시간이 오래 걸릴 수 있습니다(최대 몇 분). 런타임은 함수 이름을 확인하기 위해 캡처된 모든 관리 코드에 대한 형식 및 메서드 정보를 전송해야 합니다.

다음 단계