Marble Torch / ClarityTrace

Most .NET profilers hand you an incomplete capture and never say so

ClarityTrace records the full call tree, tells you plainly when a capture is partial, and exports a report an AI coding agent can read straight from the file. Built for .NET developers who work alongside tools like Claude Code, Codex and Cursor.

In development.

The problem

A profiler that starts after the interesting work, overruns its buffers, or only ever sees one thread will still hand you a report. Most give no sign that the capture underneath it is partial, so you optimise against numbers that describe a fraction of the run.

And the report itself is shaped for a human squinting at a GUI: a trace file you reload into a proprietary viewer, click through, and read one pane at a time. An agent working in your terminal cannot open it.

What ClarityTrace does

Checks the capture before you trust it

Every capture is sanity-checked. Too few events, a sample rate that points at an idle target, unresolved symbols, one thread holding nearly all the CPU while others sit idle — each is stated in plain words at the top of the report, before a single measurement.

Re-records a starved capture, once

When the trace session drops events because its buffer was too small, ClarityTrace runs it again at a larger buffer and tells you the numbers describe the second run. The right buffer size cannot be known until something has been captured, so it is measured, not guessed.

Records the full call tree

Hot methods by self time, the call tree caller to callee, thread and blocked-time breakdown, GC pauses, and allocation hotspots by the code that drove them. Built on .NET's own EventPipe tracing, so a capture is managed frames all the way down.

Exports a report an agent can read

Plain text to stdout, written to be read once in order by a person or an assistant. No viewer, no export step. An agent that can run a shell command is already integrated, with nothing to set up.

The report is the product

One run, one plain-text report. It leads with the capture's own health, then your code first, because those are the rows you can go and edit.

CAPTURE QUALITY: suspect. Read these before the numbers below.
  - Thread 8104 holds 98% of the CPU samples while 5 other
    thread(s) were seen doing almost nothing.

Events: 230610 | Samples: 3053 | Threads: 7 | Duration: 8.0s | Backend: EventPipe
CPU samples: 3032 | Blocked (app waiting): 9 | Parked: 12

Your code (CPU self time, charged to the deepest frame in your solution):
1. Program.Crunch (self 2307, 76.1%) - Program.cs:15

Allocations: 17.5 GB sampled across 175219 GC allocation events
1. ByteReader.ReadBytes (208.2 MB, 37.0%) - ByteReader.cs:64
   - allocated in System.IO.FileStream.Read (100.0%)
An example of the report format. Every section names its units and says what the profiler could not see.

Features

The profiler detects which runtime a process was built against and picks the matching backend for you. You never choose one.

In development. For early access or questions, email hello@marbletorch.com. Product support is at support@marbletorch.com.