힙 분석 도구(dotnet-gcdump)

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

설치

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

참고 항목

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

개요

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

설명

dotnet-gcdump 전역 도구는 EventPipe를 사용하여 라이브 .NET 프로세스의 GC(가비지 수집기) 덤프를 수집합니다. GC 덤프는 대상 프로세스에서 GC를 트리거하고 특수 이벤트를 켠 후 이벤트 스트림에서 개체 루트의 그래프를 다시 생성하여 만듭니다. 이 프로세스를 통해 프로세스가 실행되는 동안 최소한의 오버헤드로 GC 덤프를 수집할 수 있습니다. 해당 덤프는 다음을 비롯한 여러 시나리오에서 유용합니다.

  • 여러 시점에 힙의 개체 수 비교
  • 개체 루트 분석(“이 형식에 대한 참조를 여전히 포함하는 것은 무엇인가요?” 등의 질문에 답변)
  • 힙의 개체 수에 대한 일반 통계 수집

dotnet-gcdump에서 캡처된 GC 덤프 보기

Windows의 .gcdump 파일은 분석을 위해 PerfView에서 보거나 Visual Studio에서 볼 수 있습니다. Windows 이외의 플랫폼에서는 현재 .gcdump를 열 수 없습니다.

.gcdump를 여러 개 수집하고 Visual Studio에서 동시에 열어 비교할 수 있습니다.

옵션

  • --version

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

  • -h|--help

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

명령

명령
dotnet-gcdump collect
dotnet-gcdump ps
dotnet-gcdump report

dotnet-gcdump collect

현재 실행 중인 프로세스에서 GC 덤프를 수집합니다.

Warning

GC 힙을 탐색하기 위해 이 명령은 2세대(전체) 가비지 수집을 트리거하고 이로 인해 특히 GC 힙이 클 경우 오랜 시간 런타임이 일시 중단될 수 있습니다. GC 힙이 클 경우 성능이 중요한 환경에서는 이 명령을 사용하지 마세요.

개요

dotnet-gcdump collect [-h|--help] [-p|--process-id <pid>] [-o|--output <gcdump-file-path>] [-v|--verbose] [-t|--timeout <timeout>] [-n|--name <name>]

옵션

  • -h|--help

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

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

    GC 덤프를 수집할 프로세스 ID입니다.

  • -o|--output <gcdump-file-path>

    수집된 GC 덤프를 작성해야 하는 경로입니다. 기본값은 .\YYYYMMDD_HHMMSS_<pid>.gcdump입니다.

  • -v|--verbose

    GC 덤프를 수집하는 동안 로그를 출력합니다.

  • -t|--timeout <timeout>

    이 시간(초)보다 오래 걸릴 경우 GC 덤프 수집을 포기합니다. 기본값은 30입니다.

  • -n|--name <name>

    GC 덤프를 수집할 프로세스의 이름입니다.

참고 항목

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

참고 항목

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

dotnet-gcdump ps

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

개요

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

예시

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

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

dotnet-gcdump report <gcdump_filename>

이전에 생성된 GC 덤프 또는 실행 중인 프로세스에서 보고서를 생성하고 stdout에 씁니다.

개요

dotnet-gcdump report [-h|--help] [-p|--process-id <pid>] [-t|--report-type <HeapStat>]

옵션

  • -h|--help

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

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

    GC 덤프를 수집할 프로세스 ID입니다.

  • -t|--report-type <HeapStat>

    생성할 보고서의 유형입니다. 사용 가능한 옵션: heapstat(기본값)

문제 해결

  • gcdump에 형식 정보가 없습니다.

    .NET Core 3.1 이전에는 EventPipe를 사용하여 호출된 gcdumps 사이에 형식 캐시가 지워지지 않는 문제가 있었습니다. 이 때문에 두 번째 및 후속 gcdumps에서는 형식 정보를 확인하는 데 필요한 이벤트가 전송되지 않았습니다. 이 문제는 .NET Core 3.1-preview2에서 해결되었습니다.

  • GC 덤프에 COM 및 정적 형식이 없습니다.

    .NET Core 3.1 이전에는 EventPipe를 통해 GC 덤프를 호출할 경우 정적 및 COM 형식이 전송되지 않는 문제가 있었습니다. 이 문제는 .NET Core 3.1에서 수정되었습니다.

  • dotnet-gcdump는 정보 누락으로 인해 .gcdump 파일을 생성할 수 없습니다. 예를 들어, [오류] gcdump 중 예외: System.ApplicationException: ETL 파일에 힙 덤프의 시작은 표시되지만 완료는 표시되지 않습니다.. 또는 .gcdump 파일에 전체 힙이 포함되지 않습니다.

    dotnet-gcdump는 유도된 2세대 컬렉션 중에 가비지 수집기가 내보낸 이벤트 추적을 수집하는 방식으로 작동합니다. 힙이 충분히 크거나 이벤트 버퍼의 크기를 조정할 메모리가 충분하지 않은 경우 추적에서 힙 그래프를 재구성하는 데 필요한 이벤트가 삭제될 수 있습니다. 이 경우 힙 문제를 진단하려면 프로세스 덤프를 수집하는 것이 좋습니다.

  • dotnet-gcdump는 메모리가 제한된 환경에서 메모리 부족 문제를 일으키는 것으로 보입니다.

    dotnet-gcdump는 유도된 2세대 컬렉션 중에 가비지 수집기가 내보낸 이벤트 추적을 수집하는 방식으로 작동합니다. 이벤트 컬렉션을 위한 버퍼는 대상 애플리케이션이 소유하며 최대 256MB까지 커질 수 있습니다. dotnet-gcdump 자체도 메모리를 사용합니다. 환경에 메모리가 제한된 경우 오류를 방지하려면 gcdump를 수집할 때 이러한 요소를 고려해야 합니다.