Note
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãµã€ã³ã€ã³ãŸãã¯ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
ãã®èšäºã®å¯Ÿè±¡: âïž dotnet-trace 9.0.661903 以éã®ããŒãžã§ã³
ã€ã³ã¹ããŒã«
dotnet-trace ãããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããã«ã¯ã次㮠2 ã€ã®æ¹æ³ããããŸãã
dotnet ã°ããŒãã« ããŒã«:
dotnet-traceNuGet ããã±ãŒãžã®ææ°ã®ãªãªãŒã¹ ããŒãžã§ã³ãã€ã³ã¹ããŒã«ããã«ã¯ã次ã®ããã« dotnet tool install ã³ãã³ãã䜿çšããŸããdotnet tool install --global dotnet-traceçŽæ¥ããŠã³ããŒã:
ãå©çšã®ãã©ãããã©ãŒã ã«é©ããããŒã«ã®å®è¡å¯èœãã¡ã€ã«ãããŠã³ããŒãããŸãã
ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã (OS) ãã©ãããã©ãŒã ãŠã£ã³ããŠãº x86 | x64 | Arm | Arm-x64 Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64
æ§æ
dotnet-trace [-h, --help] [--version] <command>
説æ
dotnet-trace ããŒã«:
ã¯ãã¹ãã©ãããã©ãŒã ã® .NET 蚺æããŒã«ã§ãã
ãã€ãã£ã ãããã¡ã€ã©ãŒã䜿çšããã«ãå®è¡äžã®ããã»ã¹ã® .NET ãã¬ãŒã¹ã®ã³ã¬ã¯ã·ã§ã³ãæå¹ã«ããŸãã
.NET ã©ã³ã¿ã€ã ã®
EventPipeäžã«æ§ç¯ãããŸãããã¬ãŒã¹ãåéãã 2 ã€ã®ç°ãªãæ¹æ³ããµããŒããããŠããŸãã
-
collectåè©ã¯ãä»»æã® OS ã§äžè²«ããæ©èœãæäŸããŸãã -
collect-linuxåè©ã§ã¯ãLinux åºæã® OS æ©èœã䜿çšããŠè¿œå ã®æ©èœãæäŸããŸãã
ç¹åŸŽ collectcollect-linuxãµããŒããããŠãã OS [ä»»æ] Linux ã®ã¿ãã«ãŒãã« ããŒãžã§ã³ >= 6.4 管çè /ã«ãŒãæš©éãå¿ èŠã§ã ããã ã€ãšã¹ ãã¹ãŠã®ããã»ã¹ãåæã«ãã¬ãŒã¹ãã ããã ãµããŒããããŠããŸã ãã€ãã£ã ã©ã€ãã©ãªãšã«ãŒãã« ã€ãã³ãããã£ããã£ãã ããã ãµããŒããããŠããŸã ã€ãã³ãåŒã³åºãå±¥æŽã«ã¯ãã€ãã£ã ãã¬ãŒã ãå«ãŸããŸã ããã ã€ãšã¹ -
ãªãã·ã§ã³
-h|--helpã³ãã³ã ã©ã€ã³ ãã«ãã衚瀺ããŸãã
--versiondotnet-trace ãŠãŒãã£ãªãã£ã®ããŒãžã§ã³ã衚瀺ããŸãã
ã³ãã³ã
| ã³ãã³ã |
|---|
| dotnet-trace collect |
| dotnet-trace collect-linux |
| dotnet-trace convert |
| dotnet-trace ps |
| dotnet-trace list-profiles |
| dotnet-trace ã¬ããŒã |
dotnet-trace collect
å®è¡äžã®ããã»ã¹ãã蚺æãã¬ãŒã¹ãåéããããåããã»ã¹ãèµ·åããŠããããã¬ãŒã¹ããŸã (.NET 5 以é)ã ããŒã«ã«åããã»ã¹ãå®è¡ããããã®èµ·åãããã¬ãŒã¹ãããã«ã¯ãcollect ã³ãã³ãã« -- ã远å ããŸãã
æ§æ
dotnet-trace collect
[--buffering-mode <Drop|Block>]
[--buffersize <size>]
[--clreventlevel <clreventlevel>]
[--clrevents <clrevents>]
[--dsrouter <ios|ios-sim|android|android-emu>]
[--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 <list-of-comma-separated-profile-names>]
[--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>]
ãªãã·ã§ã³
--buffering-mode <Drop|Block>dotnet-traceããŒãžã§ã³ 10.0.750501 以éã§äœ¿çšã§ããŸããã©ã³ã¿ã€ã ãã€ãã³ãããããã¡ãŒããæ¹æ³ãèšå®ããŸãã
DropãŸãã¯Block(倧æåãšå°æåãåºå¥ããªã) ãåãå ¥ããæ¢å®å€ã¯Dropã-
Drop(æ¢å®å€): ãããã¡ãŒãªãŒããŒãããŒæã«ã€ãã³ããåé€ãããŸãã -
Block: ã€ãã³ããåºåããã¹ã¬ããã¯ããããã¡ãŒã«æ ŒçŽãã空ã容éãååšãããŸã§åŸ æ©ããŸãã ã¡ã¢ãªäžè¶³ãªã©ã®äžè¬çã§ãªããšã©ãŒæ¡ä»¶äžã§ã¯ãã€ãã³ããç Žæ£ãããå¯èœæ§ããããŸããBlockã«ã¯ã.NET 11 以äžã®ã¿ãŒã²ãã ã©ã³ã¿ã€ã ãå¿ èŠã§ããããããã¡ãŒããã£ã±ãã®éã«ã€ãã³ããçæããã¹ã¬ãããäžæåæ¢ããããããã¬ãŒã¹ãããã¢ããªã±ãŒã·ã§ã³ã®é床ãäœäžããå¯èœæ§ããããŸãã
-
--buffersize <size>ã¡ã¢ãªå ã®ãããã¡ãŒã®ãµã€ãºãã¡ã¬ãã€ãã«èšå®ããŸãã æ¢å®ã¯ 256 MB ã§ãã
泚æ
ã€ãã³ãããã£ã¹ã¯ã«æžã蟌ãŸãããããéãã¿ãŒã²ãã ããã»ã¹ã«ãã£ãŠäœæãããå Žåããã®ãããã¡ãŒããªãŒããŒãããŒããäžéšã®ã€ãã³ããåé€ãããå¯èœæ§ããããŸãã ãã®åé¡ã軜æžããã«ã¯ããããã¡ãŒ ãµã€ãºã倧ããããããèšé²ãããã€ãã³ãã®æ°ãæžãããŸãã
--clreventlevel <clreventlevel>çæããã CLR ã€ãã³ãã®è©³çŽ°åºŠã ãã®ãªãã·ã§ã³ã¯ã
--clreventsãæå®ãããŠããå Žåã«ã®ã¿é©çšããã--profileãŸãã¯--providersã«ãã£ãŠãªãŒããŒã©ã€ããããŸããã æ¬¡ã®è¡šã«ã䜿çšå¯èœãªã€ãã³ã ã¬ãã«ã瀺ããŸããæååå€ æ°å€ logalways0critical1error2warning3informational4verbose5--clrevents <clrevents>æå¹ã«ãã CLR ã©ã³ã¿ã€ã ãããã€ããŒã®ããŒã¯ãŒãã®ã
+èšå·ã§åºåããããªã¹ãã ããã¯ã16 é²å€ã§ã¯ãªãæååã®å¥åã䜿çšããŠã€ãã³ã ããŒã¯ãŒããæå®ã§ããããã«ãããåçŽãªãããã³ã°ã§ãã ããšãã°ãdotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:3:4ã§ã¯ãdotnet-trace collect --clrevents gc+gchandle --clreventlevel informationalãšåãã€ãã³ãã®ã»ãããèŠæ±ãããŸãã CLR ã©ã³ã¿ã€ã ãããã€ããŒã®Microsoft-Windows-DotNETRuntimeã--providersãŸãã¯--profileã«ãã£ãŠãæå¹ã«ãªã£ãŠããå Žåããã®ãªãã·ã§ã³ã¯ç¡èŠãããŸãã æ¬¡ã®è¡šã«ã䜿çšå¯èœãªããŒã¯ãŒãã®äžèЧã瀺ããŸããããŒã¯ãŒãæååã®ãšã€ãªã¢ã¹ ããŒã¯ãŒãã® 16 é²å€ gc0x1gchandle0x2assemblyloader0x4loader0x8jit0x10ngen0x20startenumeration0x40endenumeration0x80security0x400appdomainresourcemanagement0x800jittracing0x1000interop0x2000contention0x4000exception0x8000threading0x10000jittedmethodiltonativemap0x20000overrideandsuppressngenevents0x40000type0x80000gcheapdump0x100000gcsampledobjectallocationhigh0x200000gcheapsurvivalandmovement0x400000managedheapcollect0x800000gcheapandtypenames0x1000000gcsampledobjectallocationlow0x2000000perftrack0x20000000stack0x40000000threadtransfer0x80000000debugger0x100000000monitoring0x200000000codesymbols0x400000000eventsource0x800000000compilation0x1000000000compilationdiagnostic0x2000000000methoddiagnostic0x4000000000typediagnostic0x8000000000jitinstrumentationdata0x10000000000profiler0x20000000000waithandle0x40000000000allocationsampling0x80000000000CLR ãããã€ããŒã®è©³çްã«ã€ããŠã¯ã .NET ã©ã³ã¿ã€ã ãããã€ããŒã®ãªãã¡ã¬ã³ã¹ ããã¥ã¡ã³ããåç §ããŠãã ããã
'--dsrouter {ios|ios-sim|android|android-emu}
dotnet-dsrouter ãèµ·åããããã«æ¥ç¶ããŸãã dotnet-dsrouter ãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã 詳现ã«ã€ããŠã¯ã
dotnet-dsrouter -hãå®è¡ããŸãã--format {Chromium|NetTrace|Speedscope}ãã¬ãŒã¹ ãã¡ã€ã«ã®åºåã®å€æåœ¢åŒãèšå®ããŸãã æ¢å®å€ã¯ã
NetTraceã§ãã-n, --name <name>ãã¬ãŒã¹ãåéããããã»ã¹ã®ååã
泚æ
Linux ãš macOS ã§ã¯ããã®ãªãã·ã§ã³ã䜿çšããã«ã¯ãã¿ãŒã²ãã ã¢ããªã±ãŒã·ã§ã³ãš
dotnet-traceãåãTMPDIRç°å¢å€æ°ãå ±æããå¿ èŠããããŸãã ãã以å€ã®å Žåããã®ã³ãã³ãã¯ã¿ã€ã ã¢ãŠãããŸãã--diagnostic-port <port-address[,(listen|connect)]>ãã¬ãŒã¹ããããã»ã¹ãšã®éä¿¡ã«äœ¿çšãã 蚺æããŒã ãèšå®ããŸãã ã¿ãŒã²ãã ããã»ã¹å ã® dotnet-trace ãš .NET ã©ã³ã¿ã€ã ã¯ãããŒã ã¢ãã¬ã¹ã«åæããå¿ èŠããããŸãã1 ã€ã¯ãªãã¹ã³ãããã 1 ã€ã¯æ¥ç¶ããŠããå¿ èŠããããŸãã dotnet-trace ã¯ã
--process-idãŸãã¯--nameãªãã·ã§ã³ã䜿çšããŠæ¥ç¶ãããšãããŸãã¯-- <command>ãªãã·ã§ã³ã䜿çšããŠããã»ã¹ãèµ·åãããšãã«ãæ£ããããŒããèªåçã«æ±ºå®ããŸãã éåžžãããŒããæç€ºçã«æå®ããå¿ èŠãããã®ã¯ãå°æ¥éå§ãããããã»ã¹ãåŸ æ©ãããšãããŸãã¯çŸåšã®ããã»ã¹åå空éã®äžéšã§ã¯ãªãã³ã³ãããŒå ã§å®è¡ãããŠããããã»ã¹ãšéä¿¡ããå Žåã®ã¿ã§ããport-address㯠OS ã«ãã£ãŠç°ãªããŸãã- Linux ãš macOS -
/foo/tool1.socketãªã©ã® Unix ãã¡ã€ã³ ãœã±ãããžã®ãã¹ã - Windows -
\\.\pipe\my_diag_port1ãªã©ã®ååä»ããã€ããžã®ãã¹ã - AndroidãiOSãtvOS -
127.0.0.1:9000ãªã©ã® IP:portã
æ¢å®ã§ã¯ã
dotnet-traceã¯æå®ããã¢ãã¬ã¹ã§ãªãã¹ã³ããŸãã ã¢ãã¬ã¹ã®åŸã«dotnet-traceã远å ããããšã§ã代ããã«æ¥ç¶ãã,connectãèŠæ±ã§ããŸãã ããšãã°ã--diagnostic-port /foo/tool1.socket,connectã¯ã/foo/tool1.socketUnix ãã¡ã€ã³ ãœã±ããããªãã¹ã³ããŠãã .NET ã©ã³ã¿ã€ã ããã»ã¹ã«æ¥ç¶ããŸãããã®ãªãã·ã§ã³ã䜿çšããŠã¢ããªã®èµ·åæãããã¬ãŒã¹ãåéããæ¹æ³ã«ã€ããŠã¯ãã 蚺æããŒãã䜿çšããŠã¢ããªã®èµ·åæãããã¬ãŒã¹ãåéããããåç §ããŠãã ããã
- Linux ãš macOS -
--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ã
泚æ
Linux ãš macOS ã§ã¯ããã®ãªãã·ã§ã³ã䜿çšããã«ã¯ãã¿ãŒã²ãã ã¢ããªã±ãŒã·ã§ã³ãš
dotnet-traceãåãTMPDIRç°å¢å€æ°ãå ±æããå¿ èŠããããŸãã ãã以å€ã®å Žåããã®ã³ãã³ãã¯ã¿ã€ã ã¢ãŠãããŸãã--profile <list-of-comma-separated-profile-names>ãããã¡ã€ã«ã¯ãäžè¬çãªãã¬ãŒã¹ ã·ããªãªçšã®ãããã€ããŒæ§æã®å®çŸ©æžã¿ã»ããã§ãã äžåºŠã«è€æ°ã®ãããã¡ã€ã«ãã³ã³ãã§åºåã£ãŠæå®ã§ããŸãã
--providersã«ãã£ãŠæ§æããããããã€ããŒã¯ããããã¡ã€ã«ã®æ§æããªãŒããŒã©ã€ãããŸãã åæ§ã«ãããããã®ãããã¡ã€ã«ã§ CLR ã©ã³ã¿ã€ã ãããã€ããŒãæ§æãããŠããå Žåã--clreventsã«ãã£ãŠèŠå®ããããã¹ãŠã®æ§æããªãŒããŒã©ã€ããããŸãã--profileã--providersãããã³--clreventsããã¹ãŠçç¥ãããšãæ¢å®ã§ãããã¡ã€ã«ã®dotnet-trace collectãšdotnet-commonãæå¹dotnet-sampled-thread-timeã䜿çšå¯èœãªãããã¡ã€ã«:
[ãããã¡ã€ã«] 説æ dotnet-commonäœããªãŒããŒããããç¶æããããã«èšèšããã軜éã® .NET ã©ã³ã¿ã€ã 蚺æã
GCãAssemblyLoaderãLoaderãJITãExceptionsãThreadingãJittedMethodILToNativeMapãCompilation ã€ãã³ããå«ãŸããŸã
--providers "Microsoft-Windows-DotNETRuntime:0x100003801D:4"ã«çžåœããŸããdotnet-sampled-thread-timeãµã³ãã« .NETã¹ã¬ãã ã¹ã¿ãã¯ã¯ãã©ã³ã¿ã€ã ã®æ¢å®ã®ã¬ãŒã (ãã«ãã¹ã¬ãããæå¹ãªãã«ãã§ã¯ 1 ããªç§ããšã«çŽ 1000 Hz) ã§ã䜿çšãããŠãããŠã©ãŒã« ã¯ããã¯æéã³ãŒãã®éãæšå®ããŸãã gc-verboseGC ã³ã¬ã¯ã·ã§ã³ã远跡ãããªããžã§ã¯ãã®å²ãåœãŠããµã³ããªã³ã°ããŸãã gc-collectãªãŒããŒããããéåžžã«äœãå Žåã«ã®ã¿ GC ã³ã¬ã¯ã·ã§ã³ã远跡ããŸãã databaseADO.NET ããã³ Entity Framework ããŒã¿ããŒã¹ ã³ãã³ãããã£ããã£ããŸãã ãã³ã
dotnet-sampled-thread-timeã§äœ¿çšããããµã³ããªã³ã° ã¬ãŒãã¯ãDOTNET_EventPipeThreadSamplingRateç°å¢å€æ° (ããªç§åäœã®å€) ã§å€æŽã§ããŸãã ãã®èšå®ã¯ããã»ã¹ã°ããŒãã«ã§ããããã¹ãŠã® EventPipe ã»ãã·ã§ã³ã«åœ±é¿ããŸãã 詳现ã«ã€ããŠã¯ã ç°å¢å€æ°ã䜿çšãããã¬ãŒã¹ ãåç §ããŠãã ãããæ³šæ
dotnet-trace ããŒã«ã®ä»¥åã®ããŒãžã§ã³ã§ã¯ãåéåè©ã¯
cpu-samplingãšãããããã¡ã€ã«ããµããŒãããŸããã ååã誀解ãæãããããã®ãããã¡ã€ã«ã¯åé€ãããŸããã CPU 䜿çšçã«é¢ä¿ãªãããã¹ãŠã®ã¹ã¬ããããµã³ããªã³ã°ããŸããã--profile dotnet-sampled-thread-time,dotnet-commonã䜿çšããŠãåæ§ã®çµæãåŸãããšãã§ããŸãã 以åã®cpu-samplingã®åäœãæ£ç¢ºã«äžèŽãããå¿ èŠãããå Žåã¯ã--profile dotnet-sampled-thread-time --providers "Microsoft-Windows-DotNETRuntime:0x14C14FCCBD:4"ã䜿çšããŸãã--providers <list-of-comma-separated-providers>æå¹ã«ãã
EventPipeãããã€ããŒã®ã³ã³ãåºåãã®ãªã¹ãã ãããã®ãããã€ããŒã¯ã--profile <list-of-comma-separated-profile-names>ã§ç€ºãããŠããä»»æã®ãããã€ããŒãè£å®ããŸãã ç¹å®ã®ãããã€ããŒã«äžæŽåãããå Žåããã®æ§æã¯ã--profileããã³--clreventsããã®æé»çãªæ§æãããåªå ãããŸããæ¬¡ã®ãããã€ããŒã®äžèЧã¯ã
Provider[,Provider]圢åŒã§ãã-
Providerã¯æ¬¡ã®åœ¢åŒã§ããKnownProviderName[:Flags[:Level[:KeyValueArgs]]] -
KeyValueArgsã¯æ¬¡ã®åœ¢åŒã§ãã[key1=value1][;key2=value2]
.NET ã§ã®ããã€ãã®æ¢ç¥ã®ãããã€ããŒã®è©³çްã«ã€ããŠã¯ãæ¢ç¥ã®ã€ãã³ã ãããã€ããŒã«é¢ããããŒãžãåç §ããŠãã ããã
-
-- <command>(察象ã¢ããªã±ãŒã·ã§ã³ã .NET 5.0 以éãå®è¡ããŠããå Žå)ãŠãŒã¶ãŒã¯ãã³ã¬ã¯ã·ã§ã³æ§æãã©ã¡ãŒã¿ãŒã®åŸã«ãŸã
--ãæ¬¡ã«ã³ãã³ãã远å ããã°ã5.0 以éã®ã©ã³ã¿ã€ã ã§ .NET ã¢ããªã±ãŒã·ã§ã³ãèµ·åããããšãã§ããŸãã ããã¯ãèµ·åæã®ããã©ãŒãã³ã¹ã®åé¡ãã¢ã»ã³ã㪠ããŒããŒããã³ãã€ã³ããŒã®ãšã©ãŒãªã©ãããã»ã¹ã®æ©ã段éã§çºçããåé¡ã蚺æããã®ã«åœ¹ç«ã€å ŽåããããŸããæ³šæ
ãã®ãªãã·ã§ã³ã䜿çšãããšãããŒã«ã«éä¿¡ããæåã® .NET ããã»ã¹ãç£èŠãããŸããã€ãŸããã³ãã³ããè€æ°ã® .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/JittingStartedã€ãã³ã ãããã€ããŒã«ãã£ãŠçæãããæåã®Method/JittingStartedã€ãã³ãã«éãããšãã«ãã¬ãŒã¹ã忢Microsoft-Windows-DotNETRuntimeã--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:OnButtonClickã€ãã³ã ãããã€ããŒã«ãã£ãŠåºåãããMethod/JittingStartedåå空éã§OnButtonClickã¡ãœããã®æåã®Programã€ãã³ãã§ãã¬ãŒã¹ã忢Microsoft-Windows-DotNETRuntimeã
泚æ
- å€§èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã¬ãŒã¹ã®åæ¢ã«é·ãæé (æå€§å) ãããå ŽåããããŸãã ã©ã³ã¿ã€ã ã§ã¯ããã¬ãŒã¹ã«ãã£ããã£ããããã¹ãŠã®ãããŒãžã ã³ãŒãã察象ã«ãåãã£ãã·ã¥ãéä¿¡ããå¿ èŠããããŸãã
-
dotnet-traceã䜿ã£ãŠãã¬ãŒã¹ãåéããã«ã¯ãã¿ãŒã²ãã ããã»ã¹ãå®è¡ããŠãããŠãŒã¶ãŒãšåããŠãŒã¶ãŒãŸãã¯ã«ãŒããšããŠå®è¡ããå¿ èŠããããŸãã ãã以å€ã®å Žåããã®ããŒã«ã§ã¿ãŒã²ãã ããã»ã¹ãšã®æ¥ç¶ã確ç«ããããšã¯ã§ããŸããã -
dotnet-trace collectã®å®è¡äžã«ãã³ãã«ãããªãäŸå€ãçºçããå Žåããã¬ãŒã¹ãäžå®å šã«ãªããŸãã äŸå€ã®æ ¹æ¬åå ãèŠã€ããããšãåªå ãããå Žåããã¯ã©ãã·ã¥æã«ãã³ãã®åéãã«ç§»åããŠãã ããã ãã³ãã«ãããªãäŸå€ã®çµæãšããŠãã©ã³ã¿ã€ã ãã·ã£ããããŠã³ãããšãã«ãã¬ãŒã¹ãåãæšãŠããããã³ã°ãããŒã¿ã®ç Žæãªã©ã®ä»ã®æãŸãããªãåäœãé²ãããšãã§ããŸãã ãã¬ãŒã¹ãäžå®å šãªå Žåã§ãããããéããŠãé害ã«è³ããŸã§äœãèµ·ãã£ããã確èªããããšãã§ããŸãã ãã ããã©ã³ããŠã³æ å ± (ããã¯ãã¬ãŒã¹ã®æåŸã«çºçããŸã) ãæ¬ èœããŠããã®ã§ãã¹ã¿ãã¯ã解決ãããªãå¯èœæ§ããããŸã (æå¹ã«ãªã£ãŠãããããã€ããŒã«ãã£ãŠç°ãªããŸã)ã ã³ãã³ãã©ã€ã³ã§/ContinueOnErrorãã©ã°ãæå®ã㊠PerfView ãå®è¡ãããã¬ãŒã¹ãéããŸãã ãã°ã«ã¯ãäŸå€ãçºçããå Žæãå«ãŸããŸãã -
--stopping-event-*ãªãã·ã§ã³ã䜿çšããŠåæ¢ã€ãã³ããæå®ãããšãEventStream ãéåæçã«è§£æããããããæå®ãã忢ã€ãã³ã ãªãã·ã§ã³ã«äžèŽãããã¬ãŒã¹ ã€ãã³ããè§£æãããŠãã EventPipeSession ã忢ããããŸã§ã®éã«ãããã€ãã®ã€ãã³ããééããŸãã
dotnet-trace collect-linux
Linux OS ãã¯ãããžã§ãã perf_events ã䜿çšããŠèšºæãã¬ãŒã¹ãåéããŸãã
collect-linux ã§ã¯ã collectã«å¯ŸããŠæ¬¡ã®è¿œå æ©èœãæå¹ã«ãªããŸãã
| ç¹åŸŽ | collect |
collect-linux |
|---|---|---|
| ãµããŒããããŠãã OS | [ä»»æ] | Linux ã®ã¿ãã«ãŒãã« ããŒãžã§ã³ >= 6.4 |
| 管çè /ã«ãŒãæš©éãå¿ èŠã§ã | ããã | ã€ãšã¹ |
| ãã¹ãŠã®ããã»ã¹ãåæã«ãã¬ãŒã¹ãã | ããã | ãµããŒããããŠããŸã |
| ãã€ãã£ã ã©ã€ãã©ãªãšã«ãŒãã« ã€ãã³ãããã£ããã£ãã | ããã | ãµããŒããããŠããŸã |
| ã€ãã³ãåŒã³åºãå±¥æŽã«ã¯ãã€ãã£ã ãã¬ãŒã ãå«ãŸããŸã | ããã | ã€ãšã¹ |
[åææ¡ä»¶]
-
CONFIG_USER_EVENTS=yããµããŒããããŠãã Linux ã«ãŒãã« (ã«ãŒãã« 6.4 以é) - ããŠã³ãããã tracefs (æ¢å®å€ã¯
/sys/kernel/tracing) - ã«ãŒãã®ã¢ã¯ã»ã¹èš±å¯
- .NET 10 以é
泚æ
collect-linuxåè©ã¯ãglibc ããŒãžã§ã³ 2.27 以éã® Linux x64 ããã³ Linux Arm64 ç°å¢ã§ã®ã¿å®è¡ãããŸãã
.NET 10 ã®å
¬åŒã«ãµããŒããããŠãããã¹ãŠã® Linux ãã£ã¹ããªãã¥ãŒã·ã§ã³ã§ã¯ãAlpine 3.22 ãé€ãããã®èŠä»¶ããµããŒããããŠããŸãã
ã·ã¹ãã ã® libc ã®ããŒãžã§ã³ãç°¡åã«ç¢ºèªããã«ã¯ãã³ãã³ã ldd --version ã䜿çšããããlibc ã©ã€ãã©ãªãçŽæ¥å®è¡ããŸãã
ãã³ã
ã«ãŒãã«ããµããŒã user_events ãã©ããã確èªããã«ã¯ã zgrep CONFIG_USER_EVENTS /proc/config.gzãå®è¡ããŸãã tracefs ããŠã³ãã®äžã§ user_events_data ãæ€çŽ¢ããããšãã§ããŸã (æ¢å®å€ã¯ /sys/kernel/tracing/user_events_data)ã
æ§æ
dotnet-trace collect-linux
[-h|--help]
# Provider/Event Specification
[--providers <list-of-comma-separated-providers>]
[--clreventlevel <clreventlevel>]
[--clrevents <clrevents>]
[--perf-events <list-of-perf-events>]
[--profile <list-of-comma-separated-profile-names>]
# Trace Collection
[-o|--output <trace-file-path>]
[--duration dd:hh:mm:ss]
# .NET Process Target (Optional)
[-n, --name <name>]
[-p|--process-id <pid>]
# Probe mode
[--probe]
æ¢å®ã®ã³ã¬ã¯ã·ã§ã³åäœ
--providersã--profileã--clreventsãããã³--perf-eventsãæå®ãããŠããªãå Žåãcollect-linuxãããã®ãããã¡ã€ã«ã¯æ¢å®ã§æå¹ã«ãªããŸãã
-
dotnet-commonâ 軜éã® .NET ã©ã³ã¿ã€ã 蚺æã -
cpu-samplingâ ã«ãŒãã« CPU ãµã³ããªã³ã°ã
æ¢å®ã§ã¯ããã·ã³äžã®ãã¹ãŠã®ããã»ã¹ããã¬ãŒã¹ãããŸãã 1 ã€ã®ããã»ã¹ã®ã¿ããã¬ãŒã¹ããã«ã¯ã -n, --name <name> ãŸã㯠-p|--process-id <PID>ã䜿çšããŸãã
ãªãã·ã§ã³
ãããã€ããŒ/ã€ãã³ãã®ä»æ§ãªãã·ã§ã³
--providers <list-of-comma-separated-providers>æå¹ã«ãã
EventPipeãããã€ããŒã®ã³ã³ãåºåãã®ãªã¹ãã ãããã®ãããã€ããŒã¯ã--profile <list-of-comma-separated-profile-names>ã§ç€ºãããŠããä»»æã®ãããã€ããŒãè£å®ããŸãã ç¹å®ã®ãããã€ããŒã«äžæŽåãããå Žåããã®æ§æã¯ã--profileããã³--clreventsããã®æé»çãªæ§æãããåªå ãããŸããæ¬¡ã®ãããã€ããŒã®äžèЧã¯ã
Provider[,Provider]圢åŒã§ãã-
Providerã¯æ¬¡ã®åœ¢åŒã§ããKnownProviderName[:Flags[:Level[:KeyValueArgs]]] -
KeyValueArgsã¯æ¬¡ã®åœ¢åŒã§ãã[key1=value1][;key2=value2]
.NET ã®äžéšã®æ¢ç¥ã®ãããã€ããŒã®è©³çްã«ã€ããŠã¯ãã æ¢ç¥ã®ã€ãã³ã ãããã€ããŒããåç §ããŠãã ããã
-
--clreventlevel <clreventlevel>çæããã CLR ã€ãã³ãã®è©³çŽ°åºŠã ãã®ãªãã·ã§ã³ã¯ã
--clreventsãæå®ãããŠããå Žåã«ã®ã¿é©çšããã--profileãŸãã¯--providersã«ãã£ãŠãªãŒããŒã©ã€ããããŸããã æ¬¡ã®è¡šã«ã䜿çšå¯èœãªã€ãã³ã ã¬ãã«ã瀺ããŸããæååå€ æ°å€ logalways0critical1error2warning3informational4verbose5--clrevents <clrevents>æå¹ã«ãã CLR ã©ã³ã¿ã€ã ãããã€ããŒã®ããŒã¯ãŒãã®ã
+èšå·ã§åºåããããªã¹ãã ããã¯ã16 é²å€ã§ã¯ãªãæååã®å¥åã䜿çšããŠã€ãã³ã ããŒã¯ãŒããæå®ã§ããããã«ãããåçŽãªãããã³ã°ã§ãã ããšãã°ãdotnet-trace collect-linux --providers Microsoft-Windows-DotNETRuntime:3:4ã§ã¯ãdotnet-trace collect-linux --clrevents gc+gchandle --clreventlevel informationalãšåãã€ãã³ãã®ã»ãããèŠæ±ãããŸãã CLR ã©ã³ã¿ã€ã ãããã€ããŒã®Microsoft-Windows-DotNETRuntimeã--providersãŸãã¯--profileã«ãã£ãŠãæå¹ã«ãªã£ãŠããå Žåããã®ãªãã·ã§ã³ã¯ç¡èŠãããŸãã æ¬¡ã®è¡šã«ã䜿çšå¯èœãªããŒã¯ãŒãã®äžèЧã瀺ããŸããããŒã¯ãŒãæååã®ãšã€ãªã¢ã¹ ããŒã¯ãŒãã® 16 é²å€ gc0x1gchandle0x2assemblyloader0x4loader0x8jit0x10ngen0x20startenumeration0x40endenumeration0x80security0x400appdomainresourcemanagement0x800jittracing0x1000interop0x2000contention0x4000exception0x8000threading0x10000jittedmethodiltonativemap0x20000overrideandsuppressngenevents0x40000type0x80000gcheapdump0x100000gcsampledobjectallocationhigh0x200000gcheapsurvivalandmovement0x400000managedheapcollect0x800000gcheapandtypenames0x1000000gcsampledobjectallocationlow0x2000000perftrack0x20000000stack0x40000000threadtransfer0x80000000debugger0x100000000monitoring0x200000000codesymbols0x400000000eventsource0x800000000compilation0x1000000000compilationdiagnostic0x2000000000methoddiagnostic0x4000000000typediagnostic0x8000000000jitinstrumentationdata0x10000000000profiler0x20000000000waithandle0x40000000000allocationsampling0x80000000000CLR ãããã€ããŒã®è©³çްã«ã€ããŠã¯ã .NET ã©ã³ã¿ã€ã ãããã€ããŒã®ãªãã¡ã¬ã³ã¹ ããã¥ã¡ã³ããåç §ããŠãã ããã
--perf-events <list-of-perf-events>ãã¬ãŒã¹ã«å«ããããã©ãŒãã³ã¹ ã€ãã³ãã®ã³ã³ãåºåãã®äžèЧã 䜿çšå¯èœãªã€ãã³ã㯠tracefs ã®äžã«ãããŸããããã¯éåžžã
/sys/kernel/tracingã«ããŠã³ãããã䜿çšå¯èœãªãã¹ãŠã®ã€ãã³ãã®available_eventsãéããŠããŸãã¯ã«ããŽãªåãããã€ãã³ãã®events/ãµããã£ã¬ã¯ããªãä»ããŠè¡ãããŸããäŸ:
--perf-events syscalls:sys_enter_execve,sched:sched_switch,sched:sched_wakeup--profile <list-of-comma-separated-profile-names>ãããã¡ã€ã«ã¯ãäžè¬çãªãã¬ãŒã¹ ã·ããªãªçšã®ãããã€ããŒæ§æã®å®çŸ©æžã¿ã»ããã§ãã äžåºŠã«è€æ°ã®ãããã¡ã€ã«ãã³ã³ãã§åºåã£ãŠæå®ã§ããŸãã
--providersã«ãã£ãŠæ§æããããããã€ããŒã¯ããããã¡ã€ã«ã®æ§æããªãŒããŒã©ã€ãããŸãã åæ§ã«ãããããã®ãããã¡ã€ã«ã§ CLR ã©ã³ã¿ã€ã ãããã€ããŒãæ§æãããŠããå Žåã--clreventsã«ãã£ãŠèŠå®ããããã¹ãŠã®æ§æããªãŒããŒã©ã€ããããŸãã--profileã--providersã--clreventsãããã³--perf-eventsããã¹ãŠçç¥ãããšãæ¢å®ã§ãããã¡ã€ã«ã®dotnet-trace collect-linuxãšdotnet-commonãæå¹cpu-samplingã䜿çšå¯èœãªãããã¡ã€ã«:
[ãããã¡ã€ã«] 説æ dotnet-commonäœããªãŒããŒããããç¶æããããã«èšèšããã軜éã® .NET ã©ã³ã¿ã€ã 蚺æã
GCãAssemblyLoaderãLoaderãJITãExceptionsãThreadingãJittedMethodILToNativeMapãCompilation ã€ãã³ããå«ãŸããŸã
--providers "Microsoft-Windows-DotNETRuntime:0x100003801D:4"ã«çžåœããŸããcpu-samplingæ£ç¢ºãªãªã³ CPU 屿§ã®ããã«ã Universal.Events/cpuãšããŠåºåãããã«ãŒãã« CPU ãµã³ããªã³ã° (ããã©ãŒãã³ã¹ ããŒã¹)ãthread-timeCPU ã®ãªã³/ãªããšã¹ã±ãžã¥ãŒã©ã®åæã®ããã«ã Universal.Events/cswitchãšããŠåºåãããã«ãŒãã« ã¹ã¬ãã ã³ã³ããã¹ã ã¹ã€ãããgc-verboseGC ã³ã¬ã¯ã·ã§ã³ã远跡ãããªããžã§ã¯ãã®å²ãåœãŠããµã³ããªã³ã°ããŸãã gc-collectãªãŒããŒããããéåžžã«äœãå Žåã«ã®ã¿ GC ã³ã¬ã¯ã·ã§ã³ã远跡ããŸãã databaseADO.NET ããã³ Entity Framework ããŒã¿ããŒã¹ ã³ãã³ãããã£ããã£ããŸãã
ãã¬ãŒã¹ åéãªãã·ã§ã³
-o|--output <trace-file-path>åéããããã¬ãŒã¹ ããŒã¿ã®åºåãã¹ã æå®ããªãå Žåãæ¢å®ã§ã¯ãæ¢å®ã®ã³ã³ãã¥ãŒã¿ãŒå šäœã®ãã¬ãŒã¹ã«å¯ŸããŠ
trace_<yyyyMMdd>_<HHmmss>.nettraceããããã»ã¹åºæã®ãã¬ãŒã¹ (<appname>_<yyyyMMdd>_<HHmmss>.nettraceãŸãã¯--name) ã«--process-idããŸãã--duration <time-to-run>ãã¬ãŒã¹ãå®è¡ãããæéã
dd:hh:mm:ssãšãã圢åŒã䜿çšããŸãã ããšãã°00:00:00:05ã¯ã5 ç§éå®è¡ãããããšã瀺ããŸãã
.NET ããã»ã¹ ã¿ãŒã²ãã ãªãã·ã§ã³
æ¢å®ã®ã³ã¬ã¯ã·ã§ã³åäœãåç §ããŠãã ãã
-n, --name <name>ãã¬ãŒã¹ãåéããããã»ã¹ã®ååã
-p|--process-id <PID>ãã¬ãŒã¹ãåéããããã»ã¹ IDã
ãããŒã ã¢ãŒãã®ãªãã·ã§ã³
--probe [-n|--name] [-p|--process-id] [-o|--output <stdout|output-filename>]ãã¬ãŒã¹ãåéããã«ãcollect-linux ã§äœ¿çšããã EventPipe UserEvents IPC ã³ãã³ãããµããŒãããããã® .NET ããã»ã¹ããããŒãããŸãã æåã«ãµããŒããããŠããããã»ã¹ã®çµæäžèЧã '-o stdout' ã䜿çšã㊠CSV (pid,processName,supportsCollectLinux) ãã³ã³ãœãŒã«ã«åºåãããã'-o output-filename' ã䜿çšã㊠CSV ãæžã蟌ã¿ãŸãã -n|--name ãŸã㯠-p|--process-id ã䜿çšã㊠1 ã€ã®ããã»ã¹ããããŒãããŸãã
ãããŒã ã¢ãŒãã§
collect-linuxãå®è¡ããŠããã¬ãŒã¹ã¯åéãããªããããå®è¡ã«ã«ãŒãã¢ã¯ã»ã¹èš±å¯ã¯å¿ èŠãããŸããã åææ¡ä»¶ã®æ€èšŒã¯æäŸãããããã¬ãã¥ãŒ ããŒãžã§ã³ã® .NET Runtime '10.0.0' ã§å®è¡ãããŠãã .NET ããã»ã¹ã¯ãµããŒããããŠããªããšèŠãªãããŸãã
泚æ
dotnet-trace collect-linuxã䜿çšããŠãã¬ãŒã¹ãåéããã«ã¯ãã«ãŒãã¢ã¯ã»ã¹èš±å¯ (CAP_PERFMON/CAP_SYS_ADMIN) ã䜿çšããŠå®è¡ããå¿ èŠããããŸãã ãã以å€ã®å ŽåãããŒã«ã¯ã€ãã³ãã®åéã«å€±æããŸãã
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 ãã¡ã€ã«ã«å€æããå Žåãå
ã«æ»ããŸããã
speedscope ãã¡ã€ã«ãš chromium ãã¡ã€ã«ã«ã¯ãnettrace ãã¡ã€ã«ãåæ§ç¯ããããã«å¿
èŠãªæ
å ±ãäžéšå«ãŸããŠããŸããã ãã ããconvert ã³ãã³ãã«ãã£ãŠå
ã® nettrace ãã¡ã€ã«ãä¿æãããŸããä»åŸéãããšãããå Žåããã®ãã¡ã€ã«ã¯åé€ããªãã§ãã ããã
dotnet-trace ps
ãã¬ãŒã¹ãåéã§ãã dotnet ããã»ã¹ãäžèŠ§è¡šç€ºããŸãã
dotnet-trace 6.0.320703 以éã§ã¯ãåããã»ã¹ãéå§ãããã³ãã³ã ã©ã€ã³åŒæ°ã衚瀺ãããŸã (該åœããå Žå)ã
泚æ
åæããã 64 ããã ããã»ã¹ã®å®å
šãªæ
å ±ãååŸããã«ã¯ã dotnet-trace ããŒã«ã® 64 ããã ããŒãžã§ã³ã䜿çšããå¿
èŠããããŸãã
æ§æ
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 report 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 collect ã䜿çšããŠãã¬ãŒã¹ãåéããã«ã¯:
ãã¬ãŒã¹ãåéãã .NET ã¢ããªã±ãŒã·ã§ã³ã®ããã»ã¹èå¥å (PID) ãååŸããŸãã
- Windows ã§ãã¿ã¹ã¯ ãããŒãžã£ãŒããããšãã°ã
tasklistã³ãã³ãã䜿çšã§ããŸãã - Linux ã®å Žåãããšãã°ã
psã³ãã³ãã䜿çšã§ããŸãã - dotnet-trace ps
- Windows ã§ãã¿ã¹ã¯ ãããŒãžã£ãŒããããšãã°ã
次ã®ã³ãã³ããå®è¡ããŸãã
dotnet-trace collect --process-id <PID>äžã®ã³ãã³ããå®è¡ãããšã次ã®ãããªåºåãçæãããŸãã
No profile or providers specified, defaulting to trace profiles 'dotnet-common' + 'dotnet-sampled-thread-time'. Provider Name Keywords Level Enabled By Microsoft-Windows-DotNETRuntime 0x000000100003801D Informational(4) --profile Microsoft-DotNETCore-SampleProfiler 0x0000F00000000000 Informational(4) --profile Process : <full-path-to-process-being-trace> Output File : <process>_20251007_154557.nettrace [00:00:00:02] Recording trace 178.172 (KB) Press <Enter> or <Ctrl+C> to exit... Stopping the trace. This may take several minutes depending on the application being traced. Trace completed.Enter ããŒãæŒããŠã³ã¬ã¯ã·ã§ã³ã忢ããŸãã
dotnet-traceã¯ã.nettraceãã¡ã€ã«ãžã®ã€ãã³ãã®ãã°èšé²ãå®äºããŸãã
åã¢ããªã±ãŒã·ã§ã³ãèµ·åãããã®ã¹ã¿ãŒãã¢ãããããã¬ãŒã¹ã dotnet-trace ã䜿çšããŠåéããŸã
ã¹ã¿ãŒãã¢ããããããã»ã¹ã®ãã¬ãŒã¹ãåéãããšäŸ¿å©ãªå ŽåããããŸãã .NET 5 以éãå®è¡ããŠããã¢ããªã®å Žåã¯ãdotnet-trace ã䜿çšããŠãããè¡ãããšãã§ããŸãã
次ã®ã³ãã³ãã¯ãã³ãã³ã ã©ã€ã³åŒæ°ãšããŠhello.exeãšarg1ã䜿çšããŠarg2ãèµ·åããã©ã³ã¿ã€ã ã®èµ·åæãããã¬ãŒã¹ãåéããŸãã
dotnet-trace collect -- hello.exe arg1 arg2
äžã®ã³ãã³ããå®è¡ãããšã次ã®ãããªåºåãçæãããŸãã
No profile or providers specified, defaulting to trace profiles 'dotnet-common' + 'dotnet-sampled-thread-time'.
Provider Name Keywords Level Enabled By
Microsoft-Windows-DotNETRuntime 0x000000100003801D Informational(4) --profile
Microsoft-DotNETCore-SampleProfiler 0x0000F00000000000 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 ããŒãŸã㯠+ ããŒãæŒããšããã¬ãŒã¹ã®åéã忢ã§ããŸãããããè¡ããšããçµäºããŸãã
泚æ
dotnet-trace ã䜿çšã㊠hello.exe ãèµ·åãããšããã®å
¥å/åºåããªãã€ã¬ã¯ããããæ¢å®ã§ã¯ã³ã³ãœãŒã«ã§æäœã§ããªããªããŸãã ãã® stdin/stdout ãæäœããã«ã¯ã--show-child-io ã¹ã€ããã䜿çšããŸãã
Ctrl + C ãŸã㯠SIGTERM ã䜿çšããŠããŒã«ãçµäºãããšãããŒã«ãšåããã»ã¹ã®äž¡æ¹ãå®å
šã«çµäºããŸãã
ããŒã«ã®åã«åããã»ã¹ãçµäºãããšãããŒã«ãçµäºãããã¬ãŒã¹ãå®å
šã«è¡šç€ºã§ããŸãã
蚺æããŒãã䜿çšããŠã¢ããªã®èµ·åãããã¬ãŒã¹ãåéãã
蚺æããŒãã¯ã.NET 5 ã§è¿œå ãããã©ã³ã¿ã€ã æ©èœã§ãããã¢ããªã®èµ·åãããã¬ãŒã¹ãéå§ããããšãã§ããŸãã
dotnet-trace ã䜿çšããŠãããè¡ãã«ã¯ãäžèšã®äŸã®èª¬æã«åŸã£ãŠ dotnet-trace collect -- <command> ã䜿çšãããã--diagnostic-port ãªãã·ã§ã³ã䜿çšããŸãã
ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããã°ãããã¬ãŒã¹ããæ¹æ³ãšããŠã¯ãã¢ããªã±ãŒã·ã§ã³ãåããã»ã¹ãšããŠèµ·åããããã« dotnet-trace <collect|monitor> -- <command> ã䜿çšããã®ãæãç°¡åã§ãã
ãã ãã(ã¢ããªãæåã® 10 åã ãç£èŠããå®è¡ãç¶ç¶ãããªã©) ãã¬ãŒã¹ããŠããã¢ããªã®æå¹æéããã现ããå¶åŸ¡ããå ŽåããŸã㯠CLI ã䜿çšããŠã¢ããªãšå¯Ÿè©±ããå¿
èŠãããå Žåã¯ã--diagnostic-port ãªãã·ã§ã³ã䜿çšãããšãç£èŠå¯Ÿè±¡ã¢ããªãš dotnet-trace ã®äž¡æ¹ãå¶åŸ¡ã§ããŸãã
次ã®ã³ãã³ã
dotnet-tracemyport.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å¥ã®ã³ã³ãœãŒã«ã§ã
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.éèŠ
dotnet runã䜿çšããŠã¢ããªãèµ·åãããšãdotnet CLI ã«ãã£ãŠã¢ããªã§ã¯ãªãå€ãã®åããã»ã¹ãçæãããã¢ããªã®åã«dotnet-traceã«æ¥ç¶ã§ããå®è¡æã«ã¢ããªãäžæãããå¯èœæ§ããããããåé¡ãçºçããå¯èœæ§ããããŸãã ã¢ããªã±ãŒã·ã§ã³ã®èµ·åã«ã¯ãã¢ããªã®èªå·±å®çµåããŒãžã§ã³ãçŽæ¥äœ¿çšããããdotnet execã䜿çšããããšããå§ãããŸãã
(Linux ã®ã¿)dotnet-trace ã䜿çšããŠãã·ã³å šäœã®ãã¬ãŒã¹ãåéãã
ãã€ãã£ã ã©ã³ã¿ã€ã ãã¬ãŒã ã®ã·ã³ãã«ãååŸãã
collect-linux ã¯ãåŒã³åºãå±¥æŽå
ã®ãã€ãã£ã ãã¬ãŒã ããã£ããã£ããŸãã ã©ã³ã¿ã€ã ã©ã€ãã©ãªã®ãã€ãã£ã ã¡ãœããå ( libcoreclr.so ãªã©) ã解決ããã«ã¯ã察å¿ãããããã° ã·ã³ãã« ãã¡ã€ã«ãã©ã€ãã©ãªã®æšªã®ãã£ã¹ã¯ã«é
眮ããŸãã ãããã®ã·ã³ãã«ããªãå Žåããã€ãã£ã ãã¬ãŒã ã¯ãã¬ãŒã¹å
ã§æªè§£æ±ºã®ã¢ãã¬ã¹ãšããŠè¡šç€ºãããŸãã
collect-linux ãã¬ãŒã¹ã®éå§æã« JIT ã³ã³ãã€ã« ã³ãŒãã®ããã©ãŒãã³ã¹ ãããçæãåçã«æå¹ã«ãªãããã.NET ããã»ã¹ãåèµ·åããå¿
èŠã¯ãããŸããã
ãã€ãã£ã ã©ã³ã¿ã€ã ã·ã³ãã«ãããŠã³ããŒãããã«ã¯ã dotnet-symbol ã䜿çšããŸãã
dotnet-symbolãã€ã³ã¹ããŒã«ããŸããdotnet tool install -g dotnet-symbolã©ã³ã¿ã€ã ããŒãžã§ã³ã®ãããã° ã·ã³ãã«ãããŠã³ããŒãããŸãã ããšãã°ãã©ã³ã¿ã€ã ã
/usr/share/dotnet/shared/Microsoft.NETCore.App/10.0.0ã«ã€ã³ã¹ããŒã«ãããŠããå Žåã¯ã次ã®ããã«ãªããŸããdotnet-symbol --symbols /usr/share/dotnet/shared/Microsoft.NETCore.App/10.0.0/lib*.so察å¿ããã©ã³ã¿ã€ã ã©ã€ãã©ãªã®æšªã«ãããŠã³ããŒããã
.so.dbgãã¡ã€ã«ãé 眮ããŸã (ããšãã°ãlibcoreclr.so.dbgã®æšªã«libcoreclr.so)ã æ¢å®ã§ã¯ãdotnet-symbolã¯åå ¥åãã¡ã€ã«ã®æšªã«ã·ã³ãã« ãã¡ã€ã«ãæžã蟌ã¿ãŸãã ã©ã³ã¿ã€ã ã©ã€ãã©ãªã/usr/share/dotnet/...ãªã©ã®ä¿è·ããããã¹ã®äžã«ååšããå Žåã¯ãææ Œãããã¢ã¯ã»ã¹èš±å¯ã§dotnet-symbolãå®è¡ããã (ããšãã°ãsudoã䜿çšããŠ)ã-o/--outputãªãã·ã§ã³ã䜿çšããŠæžã蟌ã¿å¯èœãªãã£ã¬ã¯ããªã«æžã蟌ã¿ãã©ã³ã¿ã€ã ã©ã€ãã©ãªã®æšªã«ãã.so.dbgãã¡ã€ã«ãã³ããŒããŸãã
ã·ã³ãã«ãé
眮ããåŸã collect-linux ã¯ãã¬ãŒã¹ãåéãããšãã«ãã€ãã£ã ã¡ãœããåã解決ããŸãã
ãã®äŸã§ã¯ãã³ã³ãã¥ãŒã¿ãŒäžã®ãã¹ãŠã®ããã»ã¹ã® CPU ãµã³ãã«ããã£ããã£ããŸãã .NET 10 以éãå®è¡ããŠããããã»ã¹ã«ã¯ãGCãJITãã¢ã»ã³ããªã®èªã¿èŸŒã¿åäœãèšè¿°ãã远å ã®è»œéã€ãã³ããå«ãŸããŸãã
$ sudo dotnet-trace collect-linux
No providers, profiles, ClrEvents, or PerfEvents were specified, defaulting to trace profiles 'dotnet-common' + 'cpu-sampling'.
Provider Name Keywords Level Enabled By
Microsoft-Windows-DotNETRuntime 0x000000100003801D Informational(4) --profile
Linux Perf Events Enabled By
cpu-sampling --profile
Output File : <path-to-nettrace>trace_20251008_181939.nettrace
[00:00:00:03] Recording trace.
Press <Enter> or <Ctrl-C> to exit...
Recording stopped.
Resolving symbols.
Finished recording trace.
Trace written to <path-to-nettrace>trace_20251008_181939.nettrace
è€æ°ã® .NET ããŒãžã§ã³ãã€ã³ã¹ããŒã«ãããŠããç°å¢ã§ã¯ãcollect-linuxã§ãå®è¡ãããšã.NET ããã»ã¹ã collect-linux ã§ãã¬ãŒã¹ã§ãããã©ãããèå¥ããã®ã«åœ¹ç«ã¡ãŸãã
$ dotnet-trace collect-linux --probe
Probing .NET processes for support of the EventPipe UserEvents IPC command used by collect-linux. Requires runtime '10.0.0' or later.
.NET processes that support the command:
3802935 MyApp
.NET processes that do NOT support the command:
3809123 dotnet - Detected runtime: '10.0.0-rc.1.25451.107'
dotnet-trace ãããã£ããã£ããããã¬ãŒã¹ã衚瀺ãã
Windows ã§ã¯ãåæã®ããã« Visual Studio ãŸã㯠PerfView ã§ .nettrace ãã¡ã€ã«ã衚瀺ã§ããŸãã
Linux ã®å Žåãdotnet-trace ã®åºå圢åŒã speedscope ã«å€æŽããããšã§ãã¬ãŒã¹ã衚瀺ã§ããŸãã
-f|--format ãªãã·ã§ã³ã䜿çšããŠãåºåãã¡ã€ã«ã®åœ¢åŒã倿ŽããŸãã
nettrace (æ¢å®ã®ãªãã·ã§ã³) ã speedscope ãéžæã§ããŸãã ãªãã·ã§ã³ -f speedscope ã䜿çšãããšãdotnet-trace ã«ãã£ãŠ speedscope ãã¡ã€ã«ãçæãããŸãã
Speedscope ãã¡ã€ã«ã¯ https://www.speedscope.app ã§éãããšãã§ããŸãã
Windows 以å€ã®ãã©ãããã©ãŒã ã§åéããããã¬ãŒã¹ã®å Žåããã¬ãŒã¹ ãã¡ã€ã«ã Windows ãã·ã³ã«ç§»åããŠãVisual Studio ãŸã㯠PerfView ã§è¡šç€ºããããšãã§ããŸãã
泚æ
.NET Core ã©ã³ã¿ã€ã ã«ãããnettrace 圢åŒã§ãã¬ãŒã¹ãçæãããŸãã ãã¬ãŒã¹ã®å®äºåŸããã¬ãŒã¹ã¯ speedscope ã«å€æãããŸã (æå®ãããŠããå Žå)ã 倿ã«ãã£ãŠã¯ããŒã¿ã倱ãããå Žåããããããå
ã® nettrace ãã¡ã€ã«ã倿ããããã¡ã€ã«ã®æšªã«ä¿æãããŸãã
.rsp ãã¡ã€ã«ã䜿çšããé·ãã³ãã³ãã®å ¥åãé¿ãã
æž¡ãåŒæ°ãå«ãŸãã dotnet-trace ãã¡ã€ã«ã§ .rsp ãèµ·åã§ããŸãã ããã¯ãæåãåãé€ãã·ã§ã«ç°å¢ã䜿çšããŠãããšããé·ãåŒæ°ãæ±ãããããã€ããŒãæå¹ã«ãããšãã«äŸ¿å©ã§ãã
ããšãã°ã次ã®ãããã€ããŒã®å Žåããã¬ãŒã¹ã®ãã³ã«å ¥åããã®ãé¢åã§ãã
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