dotnet-trace 성능 분석 유틸리티

이 문서의 적용 대상: ✔️ dotnet-trace 3.0.47001 및 이후 버전

설치

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

참고 항목

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

개요

dotnet-trace [-h, --help] [--version] <command>

설명

dotnet-trace 도구:

  • 크로스 플랫폼 .NET Core 도구입니다.
  • 네이티브 프로파일러 없이 실행 중인 프로세스의 .NET Core 추적을 수집할 수 있도록 합니다.
  • .NET Core 런타임의 EventPipe를 기반으로 합니다.
  • Windows, Linux 또는 macOS에서 동일한 환경을 제공합니다.

옵션

  • -h|--help

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

  • --version

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

  • --duration

    추적을 실행하는 데 걸리는 시간입니다. --duration 00:00:00:05는 이를 5초 동안 실행합니다.

명령

명령
dotnet-trace collect
dotnet-trace convert
dotnet-trace ps
dotnet-trace list-profiles
dotnet-trace 보고서

dotnet-trace collect

실행 중인 프로세스에서 진단 추적을 수집하거나 자식 프로세스를 시작하고 추적합니다(.NET 5 이상). 도구에서 자식 프로세스를 실행하고 시작부터 추적하도록 하려면 collect 명령에 --를 추가합니다.

개요

dotnet-trace collect [--buffersize <size>] [--clreventlevel <clreventlevel>] [--clrevents <clrevents>]
    [--format <Chromium|NetTrace|Speedscope>] [-h|--help] [--duration dd:hh:mm:ss]
    [-n, --name <name>] [--diagnostic-port] [-o|--output <trace-file-path>] [-p|--process-id <pid>]
    [--profile <profile-name>] [--providers <list-of-comma-separated-providers>]
    [-- <command>] (for target applications running .NET 5 or later)
    [--show-child-io] [--resume-runtime]
    [--stopping-event-provider-name <stoppingEventProviderName>]
    [--stopping-event-event-name <stoppingEventEventName>]
    [--stopping-event-payload-filter <stoppingEventPayloadFilter>]

옵션

  • --buffersize <size>

    메모리 내 버퍼의 크기를 메가바이트 단위로 설정합니다. 기본값은 256MB입니다.

    참고 항목

    대상 프로세스가 디스크에 기록할 수 있는 것보다 더 빠르게 이벤트를 내보내는 경우 이 버퍼가 오버플로될 수 있으며 일부 이벤트가 삭제됩니다. 버퍼 크기를 늘리거나 기록되는 이벤트 수를 줄여 이 문제를 완화할 수 있습니다.

  • --clreventlevel <clreventlevel>

    내보낼 CLR 이벤트의 자세한 정도입니다. 다음 표에는 사용 가능한 이벤트 수준이 나와 있습니다.

    문자열 값 숫자 값
    logalways 0
    critical 1
    error 2
    warning 3
    informational 4
    verbose 5
  • --clrevents <clrevents>

    + 서명으로 구분할 수 있는 CLR 런타임 공급자 키워드 목록입니다. 16진수 값이 아닌 문자열 별칭을 통해 이벤트 키워드를 지정할 수 있도록 하는 간단한 매핑입니다. 예를 들어 dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:3:4dotnet-trace collect --clrevents gc+gchandle --clreventlevel informational과 동일한 이벤트 세트를 요청합니다. 다음 표에서는 사용 가능한 키워드의 목록을 보여 줍니다.

    키워드 문자열 별칭 키워드 16진수 값
    gc 0x1
    gchandle 0x2
    fusion 0x4
    loader 0x8
    jit 0x10
    ngen 0x20
    startenumeration 0x40
    endenumeration 0x80
    security 0x400
    appdomainresourcemanagement 0x800
    jittracing 0x1000
    interop 0x2000
    contention 0x4000
    exception 0x8000
    threading 0x10000
    jittedmethodiltonativemap 0x20000
    overrideandsuppressngenevents 0x40000
    type 0x80000
    gcheapdump 0x100000
    gcsampledobjectallocationhigh 0x200000
    gcheapsurvivalandmovement 0x400000
    gcheapcollect 0x800000
    gcheapandtypenames 0x1000000
    gcsampledobjectallocationlow 0x2000000
    perftrack 0x20000000
    stack 0x40000000
    threadtransfer 0x80000000
    debugger 0x100000000
    monitoring 0x200000000
    codesymbols 0x400000000
    eventsource 0x800000000
    compilation 0x1000000000
    compilationdiagnostic 0x2000000000
    methoddiagnostic 0x4000000000
    typediagnostic 0x8000000000

    .NET 런타임 공급자 참조 설명서에서 CLR 공급자에 관해 자세히 알아볼 수 있습니다.

  • --format {Chromium|NetTrace|Speedscope}

    추적 파일 변환에 대한 출력 형식을 설정합니다. 기본값은 NetTrace입니다.

  • -n, --name <name>

    추적을 수집할 프로세스의 이름입니다.

  • --diagnostic-port <path-to-port>

    만들 진단 포트의 이름입니다. 이 옵션을 사용하여 앱 시작부터 추적을 수집하는 방법을 알아보려면 진단 포트를 사용하여 앱 시작부터 추적 수집을 참조하세요.

  • --duration <time-to-run>

    추적이 실행되는 시간입니다. dd:hh:mm:ss 형식을 사용합니다. 예를 들어, 00:00:00:05는 5초 동안 실행합니다.

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

    수집된 추적 데이터의 출력 경로입니다. 지정하지 않으면 기본값은 <appname>_<yyyyMMdd>_<HHmmss>.nettrace입니다(예: `myapp_20210315_111514.nettrace`).

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

    추적을 수집할 프로세스 ID입니다.

  • --profile <profile-name>

    일반적인 추적 시나리오를 간략하게 지정할 수 있는 미리 정의되어 명명된 공급자 구성 세트입니다. 다음 프로필을 사용할 수 있습니다.

프로필 설명
cpu-sampling CPU 사용량 및 일반 .NET 런타임 정보를 추적하는 데 유용합니다. 이 옵션은 프로필 또는 공급자가 지정되지 않은 경우 기본 옵션입니다.
gc-verbose GC 컬렉션을 추적하고 개체 할당을 샘플링합니다.
gc-collect 매우 낮은 오버헤드로 GC 컬렉션을 추적합니다.
  • --providers <list-of-comma-separated-providers>

    사용하도록 설정할 EventPipe 공급자에 대한 쉼표로 구분된 목록입니다. 이러한 공급자는 --profile <profile-name>에서 암시하는 모든 공급자를 보완합니다. 특정 공급자에 대한 불일치 항목이 있는 경우 이 구성이 프로필의 암시적 구성보다 우선합니다.

    이 공급자 목록의 형식은 다음과 같습니다.

    • Provider[,Provider]
    • Provider의 형식: KnownProviderName[:Flags[:Level][:KeyValueArgs]]
    • KeyValueArgs의 형식: [key1=value1][;key2=value2]

    .NET의 잘 알려진 몇 가지 공급자에 대해 자세히 알아보려면 잘 알려진 이벤트 공급자를 참조하세요.

  • -- <command>(.NET 5 이상을 실행하는 대상 애플리케이션)

    사용자는 컬렉션 구성 매개 변수 다음에 --와 명령을 차례로 추가하여 5.0 런타임 이상에서 .NET 애플리케이션을 시작할 수 있습니다. 이 옵션은 시작 성능 문제 또는 어셈블리 로더 및 바인더 오류와 같이 프로세스 초기에 발생하는 문제를 진단할 때 도움이 될 수 있습니다.

    참고 항목

    이 옵션을 사용하면 도구에 다시 전달되는 첫 번째 .NET 5 프로세스가 모니터링됩니다. 즉, 명령에서 여러 .NET 애플리케이션을 시작하는 경우 첫 번째 앱만 수집합니다. 따라서 자체 포함 애플리케이션에서 이 옵션을 사용하거나 dotnet exec <app.dll> 옵션을 사용하는 것이 좋습니다.

  • --show-child-io

    현재 콘솔에서 시작된 자식 프로세스의 입력 및 출력 스트림을 표시합니다.

  • --resume-runtime

    세션이 초기화되면 런타임을 다시 시작합니다. 기본값은 true입니다. --resume-runtime:false를 사용하여 런타임 다시 시작을 사용하지 않도록 설정합니다.

  • --stopping-event-provider-name

    일치하는 공급자 이름이 있는 이벤트가 발생하면 추적을 중지하는 문자열입니다(있는 그대로 구문 분석됨). 보다 구체적인 중지 이벤트를 위해서는 --stopping-event-event-name 및/또는 --stopping-event-payload-filter를 추가로 제공합니다. 예를 들어, --stopping-event-provider-name Microsoft-Windows-DotNETRuntime: Microsoft-Windows-DotNETRuntime 이벤트 공급자가 내보낸 첫 번째 이벤트에 도달할 때 추적을 중지합니다.

  • --stopping-event-event-name

    일치하는 이벤트 이름을 가진 이벤트에 도달하면 추적을 중지하는 문자열입니다(있는 그대로 구문 분석됨). 설정하려면 --stopping-event-provider-name이 필요합니다. 보다 구체적인 중지 이벤트를 위해서는 추가로 --stopping-event-payload-filter를 제공합니다. 예를 들어, --stopping-event-provider-name Microsoft-Windows-DotNETRuntime --stopping-event-event-name Method/JittingStartedMicrosoft-Windows-DotNETRuntime 이벤트 공급자가 내보낸 첫 번째 Method/JittingStarted 이벤트에 도달할 때 추적을 중지합니다.

  • --stopping-event-payload-filter

    지정된 모든 페이로드 쌍이 포함된 이벤트가 발생하면 추적을 중지하는 문자열입니다(쉼표로 구분된 [payload_field_name]:[payload_field_value] 쌍으로 구문 분석됨) . 설정하려면 --stopping-event-provider-name--stopping-event-event-name이 필요합니다. 예를 들어, --stopping-event-provider-name Microsoft-Windows-DotNETRuntime --stopping-event-event-name Method/JittingStarted --stopping-event-payload-filter MethodNameSpace:Program,MethodName:OnButtonClickMicrosoft-Windows-DotNETRuntime 이벤트 공급자가 내보낸 Program 네임스페이스의 OnButtonClick 메서드에 대한 첫 번째 Method/JittingStarted 이벤트에서 추적을 중지합니다.

참고 항목

  • 대규모 애플리케이션에서는 추적을 중지하는 데 오래 걸릴 수 있습니다(최대 몇 분). 런타임에서는 추적에 캡처된 모든 관리 코드의 형식 캐시를 전송해야 합니다.
  • Linux 및 macOS에서 해당 명령은 대상 애플리케이션 및 dotnet-trace가 동일한 TMPDIR 환경 변수를 공유할 것으로 예상합니다. 그러지 않으면 명령 시간이 초과됩니다.
  • dotnet-trace를 사용하여 추적을 수집하려면 대상 프로세스를 실행하는 사용자와 동일한 사용자 또는 루트로 실행해야 합니다. 그러지 않으면 도구는 대상 프로세스와 연결을 설정하지 못합니다.
  • [ERROR] System.ComponentModel.Win32Exception (299): A 32 bit processes cannot access modules of a 64 bit process.와 유사한 오류 메시지가 표시되면 대상 프로세스와 비트가 일치하지 않는 dotnet-trace 버전을 사용하려고 하는 것입니다. 설치 링크에서 도구의 올바른 비트 수를 다운로드해야 합니다.
  • dotnet-trace collect를 실행하는 동안 처리되지 않은 예외가 발생하면 추적이 불완전해집니다. 예외의 근본 원인을 찾는 것이 최우선이라면 충돌 시 덤프 수집으로 이동합니다. 처리되지 않은 예외로 인해 중단이나 데이터 손상과 같은 원치 않는 동작을 방지하기 위해 런타임이 종료될 때 추적이 잘립니다. 추적이 불완전하더라도 추적을 열어 실패 원인을 확인할 수 있습니다. 그러나 런다운 정보가 누락되므로(이는 추적이 끝날 때 발생함) 스택이 해결되지 않을 수 있습니다(켜져 있는 공급자에 따라 다름). 명령줄에서 /ContinueOnError 플래그와 함께 PerfView를 실행하여 추적을 엽니다. 로그에는 예외가 발생한 위치도 포함됩니다.
  • --stopping-event-* 옵션을 통해 중지 이벤트를 지정할 때 EventStream이 비동기적으로 구문 분석되므로 지정된 중지 이벤트 옵션과 일치하는 추적 이벤트가 구문 분석되고 EventPipeSession이 중지되는 시간 사이에 전달되는 일부 이벤트가 있습니다.

dotnet-trace convert

nettrace 추적을 대체 추적 분석 도구와 함께 사용할 대체 형식으로 변환합니다.

개요

dotnet-trace convert [<input-filename>] [--format <Chromium|NetTrace|Speedscope>] [-h|--help] [-o|--output <output-filename>]

인수

  • <input-filename>

    변환할 입력 추적 파일입니다. 기본값은 trace.nettrace입니다.

옵션

  • --format <Chromium|NetTrace|Speedscope>

    추적 파일 변환에 대한 출력 형식을 설정합니다.

  • -o|--output <output-filename>

    출력 파일 이름입니다. 대상 형식의 확장명이 추가됩니다.

참고 항목

nettrace 파일을 chromium 또는 speedscope 파일로 변환하면 되돌릴 수 없습니다. speedscopechromium 파일에는 nettrace 파일을 다시 생성하는 데 필요한 정보가 일부 포함되어 있지 않습니다. 그러나 convert 명령은 원래 nettrace 파일을 유지하므로 나중에 파일을 열 계획인 경우 삭제하지 마세요.

dotnet-trace ps

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

개요

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

예시

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

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

dotnet-trace list-profiles

각 프로필에 있는 공급자 및 필터에 대한 설명이 포함된 미리 작성된 추적 프로필을 나열합니다.

개요

dotnet-trace list-profiles [-h|--help]

dotnet-trace 보고서

이전에 생성된 추적에서 stdout으로 보고서를 만듭니다.

개요

dotnet-trace report [-h|--help] <tracefile> [command]

인수

  • <tracefile>

    분석 중인 추적의 파일 경로입니다.

명령

dotnet-trace 보고서 topN

가장 긴 호출 스택에서 상위 N개 메서드를 찾습니다.

개요
dotnet-trace report <tracefile> topN [-n|--number <n>] [--inclusive] [-v|--verbose] [-h|--help]
옵션
  • -n|--number <n>

호출 스택의 상위 N개 메서드를 제공합니다.

  • --inclusive

포괄 시간을 기준으로 상위 N개 메서드를 출력합니다. 지정하지 않으면 기본적으로 전용 시간이 사용됩니다.

  • -v|--verbose

각 메서드의 매개 변수를 전체 출력합니다. 지정하지 않으면 매개 변수가 잘립니다.

dotnet-trace로 추적 수집

dotnet-trace을(를) 사용하여 추적을 수집하는 방법:

  • 추적을 수집할 .NET Core 애플리케이션의 PID(프로세스 식별자)를 확인해야 합니다.

    • 예를 들어, Windows에서 작업 관리자 또는 tasklist 명령을 사용할 수 있습니다.
    • 예를 들어, Linux에서는 ps 명령입니다.
    • dotnet-trace ps
  • 다음 명령을 실행합니다.

    dotnet-trace collect --process-id <PID>
    

    위의 명령은 다음과 유사한 출력을 생성합니다.

    Press <Enter> to exit...
    Connecting to process: <Full-Path-To-Process-Being-Profiled>/dotnet.exe
    Collecting to file: <Full-Path-To-Trace>/trace.nettrace
    Session Id: <SessionId>
    Recording trace 721.025 (KB)
    
  • <Enter> 키를 눌러 수집을 중지합니다. dotnet-trace을(를) 사용하면 trace.nettrace 파일의 이벤트 로깅이 종료됩니다.

dotnet-trace를 사용하여 자식 애플리케이션을 시작하고 시작에서 추적 수집

Important

본 작업은 .NET 5 이상을 실행하는 앱에만 적용됩니다.

경우에 따라 시작에서 프로세스의 추적을 수집하는 것이 유용할 수 있습니다. .NET 5 이상을 실행하는 앱의 경우 dotnet-trace를 사용하여 이 작업을 수행할 수 있습니다.

그러면 arg1arg2를 명령줄 인수로 사용하여 hello.exe가 시작되고 런타임 시작에서 추적을 수집합니다.

dotnet-trace collect -- hello.exe arg1 arg2

위의 명령은 다음과 유사한 출력을 생성합니다.

No profile or providers specified, defaulting to trace profile 'cpu-sampling'

Provider Name                           Keywords            Level               Enabled By
Microsoft-DotNETCore-SampleProfiler     0x0000F00000000000  Informational(4)    --profile
Microsoft-Windows-DotNETRuntime         0x00000014C14FCCBD  Informational(4)    --profile

Process        : E:\temp\gcperfsim\bin\Debug\net5.0\gcperfsim.exe
Output File    : E:\temp\gcperfsim\trace.nettrace


[00:00:00:05]   Recording trace 122.244  (KB)
Press <Enter> or <Ctrl+C> to exit...

<Enter> 또는 <Ctrl + C> 키를 눌러 추적 수집을 중지할 수 있습니다. 그러면 hello.exe도 종료됩니다.

참고 항목

hello.exe를 dotnet-trace를 통해 시작하면 해당 입출력이 리디렉션되어 기본적으로 콘솔에서 이와 상호 작용할 수 없습니다. --show-child-io 스위치를 사용하면 해당 stdin/stdout과 상호 작용할 수 있습니다. Ctrl+C 또는 SIGTERM을 통해 도구를 종료하면 도구와 자식 프로세스가 모두 안전하게 종료됩니다. 자식 프로세스가 도구보다 먼저 종료되면 도구도 종료되고 추적을 안전하게 볼 수 있습니다.

진단 포트를 사용하여 앱 시작부터 추적 수집

Important

본 작업은 .NET 5 이상을 실행하는 앱에만 적용됩니다.

진단 포트는 앱 시작부터 추적을 시작할 수 있도록 .NET 5에 추가된 런타임 기능입니다. dotnet-trace를 사용하여 이렇게 하려면 위의 예제에 설명된 대로 dotnet-trace collect -- <command>를 사용하거나 --diagnostic-port 옵션을 사용할 수 있습니다.

dotnet-trace <collect|monitor> -- <command>를 사용하여 애플리케이션을 자식 프로세스로 실행하는 것이 시작부터 애플리케이션을 빠르게 추적하는 가장 간단한 방법입니다.

하지만 추적되는 앱의 수명을 더 세부적으로 제어하거나(예: 처음 10분간만 앱을 모니터링하고 실행 계속) CLI를 사용하여 앱을 조작해야 하는 경우에는 --diagnostic-port 옵션을 사용하여 모니터링되는 대상 앱과 dotnet-trace를 모두 제어할 수 있습니다.

  1. 아래 명령은 dotnet-trace에서 myport.sock라는 진단 소켓을 만들고 연결을 대기하게 합니다.

    dotnet-trace collect --diagnostic-port myport.sock
    

    출력

    Waiting for connection on myport.sock
    Start an application with the following environment variable: DOTNET_DiagnosticPorts=/home/user/myport.sock
    
  2. 별도의 콘솔에서 DOTNET_DiagnosticPorts 환경 변수를 dotnet-trace 출력의 값으로 설정하고 대상 애플리케이션을 시작합니다.

    export DOTNET_DiagnosticPorts=/home/user/myport.sock
    ./my-dotnet-app arg1 arg2
    

    그러면 dotnet-trace에서 my-dotnet-app 추적을 시작할 수 있습니다.

    Waiting for connection on myport.sock
    Start an application with the following environment variable: DOTNET_DiagnosticPorts=myport.sock
    Starting a counter session. Press Q to quit.
    

    Important

    dotnet run을 사용하여 앱을 시작하면 문제가 될 수 있는데, dotnet CLI가 앱이 아닌 여러 자식 프로세스를 생성할 수 있고 해당 프로세스가 앱보다 먼저 dotnet-trace에 연결하여 앱이 런타임에 일시 중단될 수 있기 때문입니다. 앱의 자체 포함 버전을 직접 사용하거나 dotnet exec를 사용하여 애플리케이션을 시작하는 것이 좋습니다.

dotnet-trace에서 캡처된 추적 보기

Windows에서는 분석을 위해 Visual Studio 또는 PerfView에서 .nettrace 파일을 볼 수 있습니다.

Linux에서는 dotnet-trace의 출력 형식을 speedscope로 변경하여 추적을 볼 수 있습니다. -f|--format 옵션을 사용하여 출력 파일 형식을 변경합니다. nettrace(기본 옵션) 및 speedscope 중에서 선택할 수 있습니다. -f speedscope 옵션을 사용하면 dotnet-tracespeedscope 파일을 생성합니다. Speedscope 파일은 https://www.speedscope.app에서 열 수 있습니다.

Windows가 아닌 플랫폼에서 수집된 추적의 경우 추적 파일을 Windows 컴퓨터로 이동하고 Visual Studio 또는 PerfView에서 볼 수도 있습니다.

참고 항목

.NET Core 런타임은 nettrace 형식으로 추적을 생성합니다. 추적이 완료된 후 추적이 speedscope(지정 된 경우)로 변환됩니다. 일부 변환으로 인해 데이터가 손실될 수 있으므로 원본 nettrace 파일이 변환된 파일과 함께 보존됩니다.

dotnet-trace를 사용하여 시간 경과에 따라 카운터 값 사용

dotnet-trace 기능:

  • 성능에 민감한 환경에서 기본 상태 모니터링을 위해 EventCounter을(를) 사용합니다. 예를 들어, 프로덕션 환경에 있습니다.
  • 실시간으로 볼 필요가 없는 추적을 수집합니다.

예를 들어, 런타임 성능 카운터 값을 수집하려면 다음 명령을 사용합니다.

dotnet-trace collect --process-id <PID> --providers System.Runtime:0:1:EventCounterIntervalSec=1

앞의 명령은 간단한 상태 모니터링을 위해 런타임 카운터에서 초당 한 번씩 보고하도록 지시합니다. EventCounterIntervalSec=1을 더 높은 값(예: 60)으로 바꾸면 카운터 데이터에서 세분성이 낮은 추적을 수집할 수 있습니다.

다음 명령은 앞의 명령보다 오버 헤드 및 추적 크기를 더 크게 줄입니다.

dotnet-trace collect --process-id <PID> --providers System.Runtime:0:1:EventCounterIntervalSec=1,Microsoft-Windows-DotNETRuntime:0:1,Microsoft-DotNETCore-SampleProfiler:0:1

앞의 명령은 런타임 이벤트와 관리되는 스택 프로파일러를 사용하지 않도록 설정합니다.

긴 명령을 입력하지 않기 위해 .rsp 파일 사용

전달할 인수를 포함하는 .rsp 파일을 사용하여 dotnet-trace를 시작할 수 있습니다. 이렇게 하면 긴 인수가 필요한 공급자를 사용하도록 설정하거나 문자를 없애는 셸 환경을 사용할 때 유용할 수 있습니다.

예를 들어 다음 공급자는 추적할 때마다 입력하는 일이 번거로울 수 있습니다.

dotnet-trace collect --providers Microsoft-Diagnostics-DiagnosticSource:0x3:5:FilterAndPayloadSpecs="SqlClientDiagnosticListener/System.Data.SqlClient.WriteCommandBefore@Activity1Start:-Command;Command.CommandText;ConnectionId;Operation;Command.Connection.ServerVersion;Command.CommandTimeout;Command.CommandType;Command.Connection.ConnectionString;Command.Connection.Database;Command.Connection.DataSource;Command.Connection.PacketSize\r\nSqlClientDiagnosticListener/System.Data.SqlClient.WriteCommandAfter@Activity1Stop:\r\nMicrosoft.EntityFrameworkCore/Microsoft.EntityFrameworkCore.Database.Command.CommandExecuting@Activity2Start:-Command;Command.CommandText;ConnectionId;IsAsync;Command.Connection.ClientConnectionId;Command.Connection.ServerVersion;Command.CommandTimeout;Command.CommandType;Command.Connection.ConnectionString;Command.Connection.Database;Command.Connection.DataSource;Command.Connection.PacketSize\r\nMicrosoft.EntityFrameworkCore/Microsoft.EntityFrameworkCore.Database.Command.CommandExecuted@Activity2Stop:",OtherProvider,AnotherProvider

또한 이전 예제에서는 "가 인수의 일부로 포함되어 있습니다. 따옴표는 각 셸에서 동일하게 처리되지 않으므로 여러 셸을 사용할 때 다양한 문제가 발생할 수 있습니다. 예를 들어 zsh에서 입력하는 명령과 cmd의 명령이 다릅니다.

해당 명령을 매번 입력하는 대신 다음 텍스트를 myprofile.rsp라는 파일에 저장할 수 있습니다.

--providers
Microsoft-Diagnostics-DiagnosticSource:0x3:5:FilterAndPayloadSpecs="SqlClientDiagnosticListener/System.Data.SqlClient.WriteCommandBefore@Activity1Start:-Command;Command.CommandText;ConnectionId;Operation;Command.Connection.ServerVersion;Command.CommandTimeout;Command.CommandType;Command.Connection.ConnectionString;Command.Connection.Database;Command.Connection.DataSource;Command.Connection.PacketSize\r\nSqlClientDiagnosticListener/System.Data.SqlClient.WriteCommandAfter@Activity1Stop:\r\nMicrosoft.EntityFrameworkCore/Microsoft.EntityFrameworkCore.Database.Command.CommandExecuting@Activity2Start:-Command;Command.CommandText;ConnectionId;IsAsync;Command.Connection.ClientConnectionId;Command.Connection.ServerVersion;Command.CommandTimeout;Command.CommandType;Command.Connection.ConnectionString;Command.Connection.Database;Command.Connection.DataSource;Command.Connection.PacketSize\r\nMicrosoft.EntityFrameworkCore/Microsoft.EntityFrameworkCore.Database.Command.CommandExecuted@Activity2Stop:",OtherProvider,AnotherProvider

myprofile.rsp를 저장했으면 다음 명령을 통해 이 구성을 사용하여 dotnet-trace를 시작할 수 있습니다.

dotnet-trace @myprofile.rsp

참고 항목