{"slug":"dotnet-asynkron-profiler","title":"dotnet-asynkron-profiler","summary":"Use the open-source free `Asynkron.Profiler` dotnet tool for CLI-first CPU, allocation, exception, contention, and heap profiling of .NET commands or existing trace artifacts.","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-09-27T21:00:29.380107Z","repo":{"url":"https://github.com/Postpartum-genushyacinthus29/dotnet-skills","stars":12,"forks":1,"license":"MIT","updatedAt":"2026-09-27T19:34:14Z"},"bodyHtml":"<hr>\n<h2>name: dotnet-asynkron-profiler\nversion: \"1.0.0\"\ncategory: \"Metrics\"\ndescription: \"Use the open-source free <code>Asynkron.Profiler</code> dotnet tool for CLI-first CPU, allocation, exception, contention, and heap profiling of .NET commands or existing trace artifacts.\"\ncompatibility: \"Requires the <code>asynkron-profiler</code> dotnet tool plus <code>dotnet-trace</code> and <code>dotnet-gcdump</code>; upstream guidance currently targets .NET SDK 10.x.\"</h2>\n<h1>Asynkron.Profiler</h1>\n<h2>Trigger On</h2>\n<ul>\n<li>the repo wants <code>Asynkron.Profiler</code> or <code>asynkron-profiler</code></li>\n<li>the user wants automation-friendly profiling output instead of GUI-only tooling</li>\n<li>profiling needs are CPU, allocation, exception, contention, or heap focused and should land as plain-text summaries in CI, scripts, or agent workflows</li>\n<li>the task needs to render an existing <code>.nettrace</code>, <code>.speedscope.json</code>, <code>.etlx</code>, or <code>.gcdump</code> file into a readable report</li>\n</ul>\n<h2>Workflow</h2>\n<ol>\n<li>Decide whether the task is a new profile capture or rendering an existing trace artifact.</li>\n<li>Prefer built <code>Release</code> output over <code>dotnet run</code> so the trace represents the target app rather than restore/build noise.</li>\n<li>Install and verify all three tools before assuming the profiler is usable:\n<ul>\n<li><code>asynkron-profiler</code></li>\n<li><code>dotnet-trace</code></li>\n<li><code>dotnet-gcdump</code></li>\n</ul>\n</li>\n<li>Choose exactly one primary mode first:\n<ul>\n<li><code>--cpu</code></li>\n<li><code>--memory</code></li>\n<li><code>--exception</code></li>\n<li><code>--contention</code></li>\n<li><code>--heap</code></li>\n</ul>\n</li>\n<li>Use <code>--input &lt;path&gt;</code> when the trace already exists and the task is about rendering or narrowing the report, not recollecting data.</li>\n<li>Refine the output only after the baseline run:\n<ul>\n<li><code>--root &lt;text&gt;</code> to anchor the call tree</li>\n<li><code>--filter &lt;text&gt;</code> to trim tables</li>\n<li><code>--exception-type &lt;text&gt;</code> for exception-heavy flows</li>\n<li><code>--calltree-depth</code>, <code>--calltree-width</code>, <code>--calltree-self</code>, <code>--calltree-sibling-cutoff</code></li>\n</ul>\n</li>\n<li>Treat <code>profile-output/</code> as the stable output folder for review artifacts and reruns.</li>\n<li>If the task needs process attach, counters, or raw official diagnostics flows rather than this CLI frontend, hand off to <code>dotnet-profiling</code>.</li>\n</ol>\n<h2>Architecture</h2>\n<pre>flowchart LR\n  A[\"Profiling task\"] --&gt; B{\"New run or existing artifact?\"}\n  B --&gt;|New run| C[\"Build target in Release\"]\n  C --&gt; D[\"Run `asynkron-profiler --mode -- &lt;command|csproj|sln&gt;`\"]\n  D --&gt; E[\"Collect via `dotnet-trace` or `dotnet-gcdump`\"]\n  E --&gt; F[\"Write reports to `profile-output/`\"]\n  B --&gt;|Existing artifact| G[\"Run `asynkron-profiler --input &lt;path&gt; [--mode]`\"]\n  G --&gt; F\n  F --&gt; H[\"Refine output with `--root`, `--filter`, and call tree flags\"]\n</pre>\n<h2>Install</h2>\n<ul>\n<li>Install the profiler tool from upstream:</li>\n</ul>\n<pre><code>dotnet tool install -g asynkron-profiler --prerelease\n</code></pre>\n<ul>\n<li>Install prerequisites:</li>\n</ul>\n<pre><code>dotnet tool install -g dotnet-trace\ndotnet tool install -g dotnet-gcdump\n</code></pre>\n<ul>\n<li>Verify the toolchain:</li>\n</ul>\n<pre><code>asynkron-profiler --help\ndotnet-trace --version\ndotnet-gcdump --version\n</code></pre>\n<h2>Practical Usage</h2>\n<h3>Capture a new profile</h3>\n<pre><code>dotnet build -c Release\nasynkron-profiler --cpu -- ./bin/Release/&lt;tfm&gt;/MyApp\n</code></pre>\n<p>Framework-dependent apps can run through <code>dotnet</code>:</p>\n<pre><code>asynkron-profiler --memory -- dotnet ./bin/Release/&lt;tfm&gt;/MyApp.dll\n</code></pre>\n<p>Project and solution paths are also valid when the tool should build and run for you:</p>\n<pre><code>asynkron-profiler --contention -- ./MyApp.csproj\nasynkron-profiler --exception -- ./MySolution.sln\n</code></pre>\n<h3>Render an existing trace</h3>\n<pre><code>asynkron-profiler --input ./profile-output/app.nettrace --cpu\nasynkron-profiler --input ./profile-output/app.etlx --memory\nasynkron-profiler --input ./profile-output/app.gcdump --heap\n</code></pre>\n<p>Manual collection with the official tools still fits when the trace must be captured separately:</p>\n<pre><code>dotnet-trace collect --output ./profile-output/app.nettrace -- dotnet run MyProject.sln\nasynkron-profiler --input ./profile-output/app.nettrace --cpu\n</code></pre>\n<h2>Option Patterns</h2>\n<ul>\n<li>mode flags:\n<ul>\n<li><code>--cpu</code> for sampled hotspots</li>\n<li><code>--memory</code> for GC allocation ticks and per-type call trees</li>\n<li><code>--exception</code> for thrown counts and throw-site trees</li>\n<li><code>--contention</code> for wait-time trees</li>\n<li><code>--heap</code> for retained heap shape via <code>dotnet-gcdump</code></li>\n</ul>\n</li>\n<li>scope and readability:\n<ul>\n<li><code>--root &lt;text&gt;</code> to focus the tree on a subsystem</li>\n<li><code>--filter &lt;text&gt;</code> to narrow function tables</li>\n<li><code>--exception-type &lt;text&gt;</code> when one exception dominates the signal</li>\n</ul>\n</li>\n<li>output shaping:\n<ul>\n<li><code>--calltree-depth &lt;n&gt;</code></li>\n<li><code>--calltree-width &lt;n&gt;</code></li>\n<li><code>--calltree-self</code></li>\n<li><code>--calltree-sibling-cutoff &lt;n&gt;</code></li>\n</ul>\n</li>\n<li>trace replay and project targeting:\n<ul>\n<li><code>--input &lt;path&gt;</code> for <code>.nettrace</code>, <code>.speedscope.json</code>, <code>.etlx</code>, or <code>.gcdump</code></li>\n<li><code>--tfm &lt;tfm&gt;</code> when the profiler must resolve a specific target framework from a <code>.csproj</code> or <code>.sln</code></li>\n</ul>\n</li>\n</ul>\n<h2>Constraints</h2>\n<ul>\n<li>upstream currently documents <code>.NET SDK 10.x</code> as the supported toolchain baseline</li>\n<li><code>dotnet run</code> is supported but usually produces noisy traces because it captures host, restore, and build work</li>\n<li>the tool is a frontend over <code>dotnet-trace</code> and <code>dotnet-gcdump</code>, so missing prerequisites or blocked diagnostics IPC will break runs</li>\n<li><code>--heap</code> captures retained heap shape, not CPU or allocation timelines</li>\n<li>this skill is for launched commands or existing trace files; if the task is process attach, counters, or raw trace authoring, prefer <code>dotnet-profiling</code></li>\n</ul>\n<h2>Deliver</h2>\n<ul>\n<li>a repeatable <code>asynkron-profiler</code> command path for the profiling mode that matches the problem</li>\n<li>explicit install and prerequisite commands</li>\n<li>a clear baseline command plus any focused <code>--root</code>, <code>--filter</code>, <code>--exception-type</code>, or call-tree options needed for readable output</li>\n<li>trace replay guidance when the task starts from an existing artifact</li>\n</ul>\n<h2>Validate</h2>\n<ul>\n<li><code>asynkron-profiler --help</code>, <code>dotnet-trace --version</code>, and <code>dotnet-gcdump --version</code> all succeed</li>\n<li>the chosen profiling mode matches the question being investigated</li>\n<li>the command profiles built <code>Release</code> output unless there is a documented reason to accept <code>dotnet run</code> noise</li>\n<li><code>profile-output/</code> contains the expected report or artifact after the run</li>\n<li>any replay flow uses an input file type that matches the selected mode</li>\n</ul>\n<h2>References</h2>\n<ul>\n<li><a href=\"references/overview.md\">overview.md</a> - tool positioning, install paths, prerequisites, and when to choose it over raw diagnostics CLIs</li>\n<li><a href=\"references/commands.md\">commands.md</a> - command patterns for capture, replay, and option tuning</li>\n<li><a href=\"references/examples.md\">examples.md</a> - mode-by-mode examples, output expectations, and troubleshooting checks</li>\n</ul>\n","files":[{"path":"references/commands.md","sizeBytes":3035,"isText":true},{"path":"references/examples.md","sizeBytes":2803,"isText":true},{"path":"references/overview.md","sizeBytes":3404,"isText":true},{"path":"SKILL.md","sizeBytes":6382,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-27T21:01:46.530676Z","sha256":"D052F4CC48B2F90A8E193FDD8C900A0E085F956AD9E45DC7A61B4E8029AE780A","sizeBytes":6337},"review":null,"source":{"repositoryUrl":"https://github.com/Postpartum-genushyacinthus29/dotnet-skills","path":"skills/dotnet-asynkron-profiler","license":"MIT","commit":"bfa4ebd86f6bd674800f209ebf72ca770c2f026b","subtreeSha":"3F7FCBDA83303BEB4A1866241565597B9855409C37B89121C3019AFCA9508163","lastSyncedAt":"2026-09-27T21:00:28.368219Z"},"reviewedAt":"2026-09-27T21:09:46.579743Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/Postpartum-genushyacinthus29/dotnet-skills/tree/main/skills/dotnet-asynkron-profiler"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install postpartum-genushyacinthus29-dotnet-skills@llmmart"},{"target":"git","command":"git clone https://github.com/Postpartum-genushyacinthus29/dotnet-skills.git"}]}