Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use `pvanalyze` to inspect existing .NET `.nettrace` files from the command line, including GC, JIT, CPU stacks, allocation, DATAS, events, exceptions, timeline, and call-tree analysis with JSON or SpeedScope. USE FOR: the user mentions pvanalyze, PerfView-style CLI trace analysis, or cross-platform .nettrace inspection; the task starts from an existing .nettrace file and needs. DO NOT USE FOR: unrelated stacks; generic tasks that do not need this specific guidance. INVOKES: inspect the reposito
.claude/skills/managedcode-pvanalyze/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | -28% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 733% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -12% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 64% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 133% | 0% |
pvanalyze, PerfView-style CLI trace analysis, or cross-platform .nettrace inspection.nettrace file and needs readable terminal or JSON output.nettraceUse dotnet-trace-collect or profiling first when the task is mostly about collecting the trace. Use pvanalyze once a trace artifact exists or when the user wants the specific command surface.
pvanalyze info <trace.nettrace> first to verify the file opens and contains the expected processes.gcstats for GC count, heap size, pause, and GC timeline questionsalloc for allocation-by-type questionsdatas for Dynamic Adaptation To Application Sizes heap-count tuningjitstats for JIT compilation costcpustacks for top CPU methods, module grouping, namespace grouping, or SpeedScope exportcalltree for hot paths and caller/callee explorationevents for provider, event type, payload, PID, or TID filteringexceptions for thrown exception summaries and detailstimeline or snapshot when an agent needs time-bucketed context--format json when another tool or agent will consume the output.--from and --to only after the baseline command confirms the interesting time window.pvanalyze clean <trace-or-directory> when generated .pvanalyze.etlx cache files should be removed.pvanalyze as a cross-platform .nettrace analyzer and explicitly says --help plus the README are the intended agent context rather than a separate upstream SKILL.md or AGENTS.md.The upstream README documents two install paths:
bash# .NET 10+ one-shot execution path dnx pvanalyze # Global tool path dotnet tool install --global pvanalyze
If the NuGet package is not resolvable in the current environment, build or pack from source:
bashgit clone https://github.com/adityamandaleeka/pvanalyze cd pvanalyze dotnet build -c Release dotnet run -c Release -- info ./trace.nettrace
The source project is configured as a .NET tool with PackageId pvanalyze, ToolCommandName pvanalyze, and VersionPrefix 0.1.0.
Install trace collection support when you need to create the input artifact:
bashdotnet tool install --global dotnet-trace dotnet-trace --version pvanalyze --help
bashpvanalyze info ./trace.nettrace pvanalyze gcstats ./trace.nettrace --format json pvanalyze gcstats ./trace.nettrace --timeline --longest 5 pvanalyze gcstats ./trace.nettrace --from 1000 --to 2000 --timeline --format json
bashpvanalyze cpustacks ./trace.nettrace --top 20 pvanalyze cpustacks ./trace.nettrace --group-by module --top 10 --format json pvanalyze cpustacks ./trace.nettrace --format speedscope --output ./trace.speedscope.json
bashpvanalyze events ./trace.nettrace --list --format json pvanalyze events ./trace.nettrace --provider DotNETRuntime --type GCStart --limit 50 pvanalyze exceptions ./trace.nettrace --type NullReference --format json pvanalyze calltree ./trace.nettrace --hot-path --depth 5 --format json pvanalyze calltree ./trace.nettrace --caller-callee "Serialize"
General trace:
bashdotnet-trace collect --process-id <PID> --output ./trace.nettrace dotnet-trace collect -- dotnet run -c Release
Allocation analysis requires allocation events:
bashdotnet-trace collect --providers "Microsoft-Windows-DotNETRuntime:0x200001:5" -- dotnet run -c Release pvanalyze alloc ./trace.nettrace --group-by type --top 20 --format json
DATAS analysis requires .NET 9+ DATAS events and verbose GC runtime events:
bashDOTNET_GCDynamicAdaptationMode=1 dotnet-trace collect -p <PID> --providers "Microsoft-Windows-DotNETRuntime:0x4C14FCCBD:5" pvanalyze datas ./trace.nettrace --changes-only --format json
--process <name> on gcstats, jitstats, alloc, or datas when a trace includes multiple .NET processes.--from <ms> and --to <ms> for GC, CPU, allocation, event, exception, timeline, and call-tree time windows.--format json for automation and --format text for human terminal review.cpustacks --group-by method|module|namespace and --inclusive to change CPU aggregation.calltree --hot-path, --caller-callee <method>, --depth <n>, and --min-percent <n> to keep stack output focused.timeline --lanes gc,cpu,exceptions,alloc,jit,events --buckets <n> for a compact multi-signal view.snapshot --at <ms> --window <ms> when the question is "what was happening around this timestamp?"pvanalyze analyzes trace artifacts; it does not replace dotnet-trace for collection..nettrace to a sibling .pvanalyze.etlx cache for repeated reads; this is useful but can surprise clean working directories.cpustacks; use SpeedScope or another viewer for interactive flame graph inspection.net8.0; the README also documents dnx pvanalyze as a .NET 10+ path.dotnet-trace collect command used or needed to capture the right eventspvanalyze command and output format.speedscope.json or .pvanalyze.etlx cache paths that matter for follow-uppvanalyze --help or dotnet run -c Release -- --help succeedsdotnet-trace --version succeeds when collection is part of the workflowpvanalyze info <trace.nettrace> reads the trace before deeper analysis begins--format json is usedpvanalyze clean <trace-or-directory> removes cache files when cache cleanup is requiredOther measured skills in the registry, with their headline benchmark lift.