| # Trace Processor (C++) | |
| _The Trace Processor is a C++ library | |
| ([/src/trace_processor](/src/trace_processor)) that ingests traces encoded in a | |
| wide variety of formats and exposes an SQL interface for querying trace events | |
| contained in a consistent set of tables. It also has other features including | |
| computation of trace summaries, annotating the trace with user-friendly | |
| descriptions and deriving new events from the contents of the trace._ | |
|  | |
| Most users will interact with Trace Processor through the | |
| [`trace_processor` shell](#shell), a command-line wrapper around the library | |
| that opens an interactive PerfettoSQL prompt. Embedders that want to integrate | |
| Trace Processor into another C++ application should jump to | |
| [Embedding the C++ library](#embedding). Python users should see the | |
| [Python API](trace-processor-python.md) instead. | |
| ## {#shell} The trace_processor shell | |
| The `trace_processor` shell is a command-line binary which wraps the C++ | |
| library, providing a convenient way to interactively analyze traces. | |
| ### Downloading the shell | |
| The shell can be downloaded from the Perfetto website. The download is a thin | |
| Python wrapper that fetches and caches the correct native binary for your | |
| platform (including `trace_processor_shell.exe` on Windows) under | |
| `~/.local/share/perfetto/prebuilts` on first use. | |
| <?tabs> | |
| TAB: Linux / macOS | |
| ```bash | |
| curl -LO https://get.perfetto.dev/trace_processor | |
| chmod +x ./trace_processor | |
| ``` | |
| TAB: Windows | |
| ```powershell | |
| curl.exe -LO https://get.perfetto.dev/trace_processor | |
| ``` | |
| Python 3 is required to run the wrapper script. `curl` ships with Windows 10 | |
| and later. | |
| </tabs?> | |
| ### Running the shell | |
| Once downloaded, you can immediately use it to open a trace file: | |
| <?tabs> | |
| TAB: Linux / macOS | |
| ```bash | |
| ./trace_processor trace.perfetto-trace | |
| ``` | |
| TAB: Windows | |
| ```powershell | |
| python trace_processor trace.perfetto-trace | |
| ``` | |
| </tabs?> | |
| This will open an interactive SQL shell where you can query the trace. For | |
| more information on how to write queries, see the | |
| [Getting Started with PerfettoSQL](perfetto-sql-getting-started.md) guide. | |
| For example, to see all the slices in a trace, you can run the following query: | |
| ```sql | |
| > SELECT ts, dur, name FROM slice LIMIT 10; | |
| ts dur name | |
| -------------------- -------------------- --------------------------- | |
| 261187017446933 358594 eglSwapBuffersWithDamageKHR | |
| 261187017518340 357 onMessageReceived | |
| 261187020825163 9948 queueBuffer | |
| 261187021345235 642 bufferLoad | |
| 261187121345235 153 query | |
| ... | |
| ``` | |
| Or, to see the values of all counters: | |
| ```sql | |
| > SELECT ts, value FROM counter LIMIT 10; | |
| ts value | |
| -------------------- -------------------- | |
| 261187012149954 1454.000000 | |
| 261187012399172 4232.000000 | |
| 261187012447402 14304.000000 | |
| 261187012535839 15490.000000 | |
| 261187012590890 17490.000000 | |
| 261187012590890 16590.000000 | |
| ... | |
| ``` | |
| ### {#subcommands} Subcommand interface | |
| In addition to launching an interactive REPL, `trace_processor` exposes a | |
| subcommand-based CLI for non-interactive workflows: running a SQL query, | |
| computing trace summaries, exporting to SQLite, starting an RPC server, and | |
| converting between trace formats. The general invocation is: | |
| ```text | |
| trace_processor <command> [flags] [positional args] | |
| ``` | |
| Run `trace_processor --help` for the top-level summary, or | |
| `trace_processor help <command>` (equivalently `trace_processor <command> --help`) | |
| for the flags accepted by a specific subcommand. The top-level help looks | |
| like this: | |
| ```text | |
| Perfetto Trace Processor. | |
| Usage: trace_processor [command] [flags] [trace_file] | |
| If no command is given, opens an interactive SQL shell on the trace file. | |
| Commands: | |
| query Load a trace and run a SQL query. | |
| interactive Interactive SQL shell (default if no command is given). | |
| server Start an RPC server (http or stdio). | |
| summarize Compute a trace summary from specs and/or built-in metrics. | |
| export Export a trace to a database file. | |
| metrics Run v1 metrics (deprecated; use 'summarize --metrics-v2'). | |
| convert Convert trace format. | |
| Common flags (apply to all commands): | |
| -h, --help Show help (per-command if after a command). | |
| -v, --version Print version. | |
| --full-sort Force full sort ignoring windowing. | |
| --no-ftrace-raw Prevent ingestion of typed ftrace into raw table. | |
| --add-sql-package PATH Register SQL files from a directory as a package. | |
| -m, --metatrace FILE Enable metatracing, write to FILE. | |
| ``` | |
| > **Backwards compatibility.** The previous flat-flag interface (e.g. `-q`, | |
| > `-Q`, `--httpd`, `--summary`, `--run-metrics`, `-e`, `--stdiod`) is fully | |
| > supported via an internal translation layer; existing scripts and | |
| > integrations continue to work unchanged. Run | |
| > `trace_processor --help-classic` to see the full classic flag reference. | |
| #### {#subcommand-query} `query` — run SQL | |
| Loads a trace, runs one or more `;`-separated SQL statements, prints the | |
| result to stdout, and exits. SQL can be supplied as an inline positional | |
| argument, read from a file with `-f/--query-file`, or piped on stdin | |
| (either by passing `-` to `--query-file` or by piping when no SQL was | |
| specified): | |
| ```bash | |
| # 1. Inline query. | |
| trace_processor query trace.pftrace "SELECT ts, dur, name FROM slice LIMIT 5" | |
| # 2. From a file. | |
| trace_processor query -f queries.sql trace.pftrace | |
| # 3. From stdin. | |
| cat queries.sql | trace_processor query trace.pftrace | |
| ``` | |
| Useful flags: | |
| - `-f, --query-file FILE` — read SQL from `FILE` (or `-` for stdin). | |
| - `-i, --interactive` — drop into the interactive REPL after the queries | |
| finish. | |
| - `-W, --wide` — double-width columns when printing results. | |
| - `--perf-file FILE` — write trace-load and query timings to `FILE`. | |
| - `--structured-query-id ID` + `--summary-spec FILE` _(advanced)_ — execute | |
| a single structured query by ID from one or more | |
| [TraceSummarySpec](trace-summary.md) files. The spec(s) replace the | |
| inline/file/stdin SQL source. | |
| #### {#subcommand-interactive} `interactive` — REPL | |
| Opens the same interactive PerfettoSQL prompt shown in the previous | |
| section. This is the default subcommand when none is specified, so | |
| `trace_processor trace.pftrace` and | |
| `trace_processor interactive trace.pftrace` are equivalent. The only | |
| subcommand-specific flag is `-W, --wide`. | |
| #### {#subcommand-server} `server` — HTTP / stdio RPC | |
| Exposes trace processor over a remote-procedure-call protocol. | |
| ```bash | |
| # HTTP server (used by ui.perfetto.dev). Listens on 9001 by default. | |
| trace_processor server http | |
| # Pre-load a trace and serve it over HTTP. | |
| trace_processor server http trace.pftrace | |
| # stdio server (length-prefixed RPC; used by tooling that embeds | |
| # trace_processor as a subprocess). | |
| trace_processor server stdio | |
| ``` | |
| Server-specific flags: | |
| - `--port PORT` — HTTP port (default 9001). | |
| - `--ip-address IP` — HTTP bind address. | |
| - `--additional-cors-origins O1,O2,...` — extra CORS-allowed origins on | |
| top of the defaults (`https://ui.perfetto.dev`, `http://localhost:10000`, | |
| `http://127.0.0.1:10000`). | |
| The trace file is optional in `http` mode: clients can also load traces | |
| remotely. The most common client is the Perfetto UI, which auto-detects a | |
| local server and offloads trace parsing to it; see | |
| [Visualising large traces](/docs/visualization/large-traces.md) for the | |
| end-user flow, or | |
| [trace_processor.proto](/protos/perfetto/trace_processor/trace_processor.proto) | |
| for the RPC wire schema. | |
| #### {#subcommand-summarize} `summarize` — trace summaries and v2 metrics | |
| Computes a [trace summary](trace-summary.md). Spec files are passed as | |
| extra positional arguments after the trace file; built-in v2 metrics are | |
| selected with `--metrics-v2`: | |
| ```bash | |
| # Run all available v2 metrics. | |
| trace_processor summarize --metrics-v2 all trace.pftrace | |
| # Run two specific metric ids defined in spec.textproto. | |
| trace_processor summarize \ | |
| --metrics-v2 startup_metric,memory_metric \ | |
| trace.pftrace spec.textproto | |
| ``` | |
| Subcommand flags: | |
| - `--metrics-v2 IDS` — comma-separated metric ids, or the literal `all`. | |
| - `--metadata-query ID` — query id used to populate the summary's | |
| `metadata` field. | |
| - `--format text|binary` — output format for the `TraceSummary` proto | |
| (default: `text`). | |
| - `--post-query FILE` — SQL file run after summarization. When set, the | |
| summary proto is _not_ printed; the SQL output is printed instead. | |
| - `--perf-file FILE` — write load/query timings to `FILE`. | |
| - `-i, --interactive` — drop into the REPL after summarization finishes. | |
| Spec files are auto-detected as binary or text based on extension | |
| (`.pb` → binary, `.textproto` → text) with a content-sniffing fallback. | |
| #### {#global-flags} Global flags (apply to every subcommand) | |
| These flags are accepted in addition to the subcommand-specific flags | |
| above and behave identically across subcommands: | |
| - **Trace ingestion:** `--full-sort`, `--no-ftrace-raw`, | |
| `--analyze-trace-proto-content`, `--crop-track-events`. | |
| - **PerfettoSQL packages:** `--add-sql-package PATH[@PKG]`, | |
| `--override-sql-package PATH[@PKG]`, `--override-stdlib PATH` | |
| (requires `--dev`). | |
| - **Metric extensions:** `--metric-extension DISK_PATH@VIRTUAL_PATH`. | |
| - **Auxiliary file content:** `--register-files-dir PATH` — exposes the | |
| contents of files under `PATH` to importers (e.g. ETM decoders). | |
| - **Development:** `--dev`, `--dev-flag KEY=VALUE`, `--extra-checks`. | |
| - **Metatracing:** `-m, --metatrace FILE`, | |
| `--metatrace-buffer-capacity N`, `--metatrace-categories CATEGORIES` — | |
| produces a Perfetto trace of trace processor itself, which can be | |
| loaded back into the UI for performance debugging. | |
| ## {#embedding} Embedding the C++ library | |
| The public API is centered on the `TraceProcessor` class defined in | |
| [`trace_processor.h`](/include/perfetto/trace_processor/trace_processor.h). All | |
| high-level operations — parsing trace bytes, executing SQL queries, computing | |
| summaries — are member functions on this class. | |
| A `TraceProcessor` instance is created via `CreateInstance`: | |
| ```cpp | |
| #include "perfetto/trace_processor/trace_processor.h" | |
| using namespace perfetto::trace_processor; | |
| Config config; | |
| std::unique_ptr<TraceProcessor> tp = TraceProcessor::CreateInstance(config); | |
| ``` | |
| ### Loading a trace | |
| To ingest a trace, call `Parse` repeatedly with chunks of trace bytes, then | |
| `NotifyEndOfFile` once the entire trace has been pushed: | |
| ```cpp | |
| while (/* more data available */) { | |
| TraceBlobView blob = /* ... */; | |
| base::Status status = tp->Parse(std::move(blob)); | |
| if (!status.ok()) { /* handle error */ } | |
| } | |
| base::Status status = tp->NotifyEndOfFile(); | |
| ``` | |
| Because reading a trace from the filesystem is a common case, a helper | |
| `ReadTrace` is provided in | |
| [`read_trace.h`](/include/perfetto/trace_processor/read_trace.h): | |
| ```cpp | |
| #include "perfetto/trace_processor/read_trace.h" | |
| base::Status status = ReadTrace(tp.get(), "/path/to/trace.pftrace"); | |
| ``` | |
| `ReadTrace` reads the file from disk, calls `Parse` with the contents, and | |
| calls `NotifyEndOfFile` for you. | |
| ### Executing queries | |
| Queries are submitted via `ExecuteQuery`, which returns an `Iterator` that | |
| streams rows back to the caller: | |
| ```cpp | |
| auto it = tp->ExecuteQuery("SELECT ts, name FROM slice LIMIT 10"); | |
| while (it.Next()) { | |
| int64_t ts = it.Get(0).AsLong(); | |
| std::string name = it.Get(1).AsString(); | |
| // ... | |
| } | |
| if (!it.Status().ok()) { | |
| // Query produced an error. | |
| } | |
| ``` | |
| Two important rules when using the iterator: | |
| - **Always call `Next` before accessing values.** The iterator is positioned | |
| before the first row when returned, so `Get` cannot be called until `Next` | |
| has returned `true`. | |
| - **Always check `Status` after iteration finishes.** A query may fail | |
| partway through; `Next` returning `false` only means iteration stopped, not | |
| that it succeeded. Inspect `Status()` to distinguish EOF from an error. | |
| See the comments in | |
| [`iterator.h`](/include/perfetto/trace_processor/iterator.h) for the full | |
| iterator API. | |
| ### Other functionality | |
| The `TraceProcessor` class also exposes: | |
| - **Trace summarization** (`Summarize`) — computes structured summaries of a | |
| trace. See [Trace Summarization](trace-summary.md) for the user-facing | |
| description of this feature. | |
| - **Custom SQL packages** (`RegisterSqlPackage`) — registers PerfettoSQL files | |
| under a package name so they can be `INCLUDE`d by queries. | |
| - **Out-of-band file content** (`RegisterFileContent`) — passes auxiliary data | |
| to importers, e.g. binaries used to decode ETM traces. | |
| - **Metatracing** (`EnableMetatrace` / `DisableAndReadMetatrace`) — traces the | |
| Trace Processor itself for performance debugging. | |
| Refer to the comments in | |
| [`trace_processor.h`](/include/perfetto/trace_processor/trace_processor.h) for | |
| the complete API surface. |