blob: a4d0650ca41a5ebef8425b99280b30f78d338128 [file] [view] [edit]
# 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._
![Trace processor block diagram](/docs/images/trace-processor.png)
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.