# Trace Processor command-line reference

`trace_processor` loads, queries, converts, enriches, and serves traces. The
native executable is built as `trace_processor_shell`; the downloadable
`trace_processor` wrapper runs it with the same command-line arguments.

For installation and your first queries, see
[Analyzing traces from the command line](/docs/getting-started/command-line-analysis.md).
For the C++ library, see [Trace Processor](/docs/analysis/trace-processor.md).

## Synopsis

```text
trace_processor <command> [flags] [positional args]
trace_processor <trace_file>
trace_processor help <command>
```

With a trace file and no command, the tool opens an interactive SQL shell.
`--help` prints top-level help; `<command> --help` and `help <command>` print
command-specific help, including the flags supported by that build.

The classic flat-flag interface (`-q`, `-Q`, `--httpd`, `--summary`,
`--run-metrics`, `-e`, `--stdiod`) remains supported. Use `--help-classic`
for its flags.

## {#global-flags} Global flags (apply to every subcommand)

These flags are accepted in addition to the subcommand-specific flags below
and behave the same across all subcommands:

- **Help and version:** `-h, --help`, `-v, --version`.
- **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`. This produces a Perfetto trace of
  trace processor itself, which you can load back into the UI for
  performance debugging.

## {#subcommands} Commands

| Command | Purpose |
| --- | --- |
| [`query`](#subcommand-query) | Run SQL and print results. |
| [`interactive`](#subcommand-interactive) | Open a SQL prompt. |
| [`server`](#subcommand-server) | Serve traces over RPC or manage a session. |
| [`summarize`](#subcommand-summarize) | Compute trace summaries. |
| [`export`](#subcommand-export) | Export parsed trace data. |
| [`convert`](#subcommand-convert) | Convert a trace to another format. |
| [`bundle`](#subcommand-bundle) | Package a trace with symbols and deobfuscation data. |
| [`util`](#subcommand-util) | Run low-level trace utilities. |
| [`metrics`](#subcommand-metrics) | Run legacy v1 metrics. |

### {#subcommand-query} `query`: run SQL

`query` loads a trace, runs one or more `;`-separated SQL statements, prints
the results to stdout, and exits. SQL can be passed as an argument, read from
a file, or piped on stdin:

```bash
# Pass SQL as an argument.
trace_processor query trace.pftrace "SELECT ts, dur, name FROM slice LIMIT 5"

# Read SQL from a file.
trace_processor query -f queries.sql trace.pftrace

# Pipe SQL on stdin.
cat queries.sql | trace_processor query trace.pftrace
```

Each statement's result set is printed as CSV, and consecutive result sets
are separated by a single blank line. The separator is unambiguous because
every string value is quoted.

Flags:

- `--remote ADDR`: run against a warm session instead of loading a local
  trace; see [sessions](/docs/analysis/trace-processor.md#sessions). `ADDR` is a session name, a `*.sock` or
  absolute socket path, or `host:port`. No trace-file argument is passed in
  this mode.
- `-f, --query-file FILE`: read SQL from `FILE`; pass `-` to read from stdin.
- `-i, --interactive`: drop into the interactive REPL after the queries
  finish.
- `-W, --wide`: use double-width columns when printing results.
- `--perf-file FILE`: write trace-load and query timings to `FILE`.
- `--structured-query-id ID` plus `--summary-spec FILE` _(advanced)_: run a
  single structured query by ID from one or more
  [TraceSummarySpec](/docs/analysis/trace-summary.md) files, instead of the SQL sources
  above.

### {#subcommand-interactive} `interactive`: REPL

`interactive` opens the same interactive PerfettoSQL prompt described in the
[shell guide](/docs/analysis/trace-processor.md#shell). It is the default subcommand, 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, or unix RPC

`server` exposes trace processor over a remote-procedure-call protocol:

```bash
# HTTP server, used by ui.perfetto.dev. Listens on port 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 for tooling that embeds
# trace_processor as a subprocess.
trace_processor server stdio

# Named unix-socket session: keeps the trace warm for repeated
# `query --remote <name>` calls (see the shell guide).
trace_processor server unix --name mysession --daemonize trace.pftrace

# Stop a unix session by name or socket path.
trace_processor server kill mysession
```

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`).
- `--name NAME`: session name for unix mode (default: auto-generated).
- `--path PATH`: explicit socket path for unix mode (mutually exclusive
  with `--name`).
- `--daemonize`: detach into the background (unix mode, POSIX only).
- `--idle-timeout auto|DUR`: reap the server after this much inactivity
  (e.g. `30m`, `90s`); `auto` means 30 minutes for unix and never for
  http, `0`/`never` disables.
- `--idle-start auto|orphaned|last-query`: when the idle clock applies
  (default `auto`: owner-aware).

The trace file is optional in `http` and `unix` modes; 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`: compute trace summaries

`summarize` computes a [trace summary](/docs/analysis/trace-summary.md). Pass the trace
file first, then any spec files; select built-in v2 metrics with
`--metrics-v2`:

```bash
# Run every available v2 metric.
trace_processor summarize --metrics-v2 all trace.pftrace

# Run two specific metrics defined in spec.textproto.
trace_processor summarize \
  --metrics-v2 startup_metric,memory_metric \
  trace.pftrace spec.textproto
```

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`: run this SQL file 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 detected as binary or text by extension (`.pb` for binary,
`.textproto` for text), with content sniffing as a fallback.

### {#subcommand-export} `export`: write trace data to a file

`export` writes the parsed trace data to a file. The format is the first
positional argument, the output path is given with `-o`:

```bash
# Version-coupled archive, loadable by the same version of trace processor.
trace_processor export perfetto -o archive.tar trace.pftrace

# Static tables as standard Arrow files in a tar.
trace_processor export arrow_tar -o tables.tar trace.pftrace

# Static tables and views as a SQLite database.
trace_processor export sqlite -o trace.db trace.pftrace
```

Formats:

- **`perfetto`**: a version-coupled archive of the non-empty static tables.
  A fresh trace processor instance from the same version can load it back as
  a trace; a different version may load it, but this is not guaranteed. The
  only format that can be reloaded.
- **`arrow_tar`**: a tar of standard [Apache Arrow](https://arrow.apache.org/)
  files, one per statically registered table, including empty tables and
  implicit ID columns. Stable and forwards-compatible across versions, for
  external consumers (e.g. pandas, Polars, pyarrow). Cannot be loaded back
  into trace processor.
- **`sqlite`**: the statically registered tables plus the trace's views, as
  a SQLite database readable by any SQLite tool.

Flags:

- `-o, --output FILE`: output file path (required).

All three formats export the statically registered tables; only `sqlite` also
includes views. Runtime tables created during the session (e.g.
`CREATE PERFETTO TABLE`) are not exported. Exports stream to disk, so memory
use stays bounded for large traces. For task-oriented recipes, see
[Export trace data](/docs/getting-started/command-line-analysis.md#export-trace-data).

### {#subcommand-convert} `convert`: change trace format

```text
trace_processor convert <format> [flags] [input] [output]
```

Formats are `systrace`, `json`, `ctrace`, `text`, `profile`, and `firefox`.
Omitted input and output paths use stdin and stdout. For `profile`, use
`--output-dir` instead of an output-file argument. Run `help convert` for
format-specific options.

### {#subcommand-util} `util`: low-level trace utilities

```text
trace_processor util <utility> [flags] [positional args]
```

Utilities are `merge`, `symbolize`, `deobfuscate`, `decompress_packets`, and
`text_to_binary`. Run `help util` for their arguments. See the
[merging guide](/docs/analysis/merging-traces.md) and
[symbolization guide](/docs/learning-more/symbolization.md) for workflows.

### {#subcommand-metrics} `metrics`: legacy v1 metrics

Runs v1 metrics. For new workflows, use `summarize --metrics-v2`. Run
`help metrics` for supported flags, and see
[Trace-based metrics](/docs/analysis/metrics.md) for the legacy workflow.

### {#subcommand-bundle} `bundle`: enrich a trace

#### Synopsis

```text
trace_processor bundle [options] <input> <output>
```

Produces an enriched trace containing the input trace, native symbol packets,
and Java/Kotlin deobfuscation packets in a TAR archive. The Perfetto UI and
Trace Processor can open this archive directly.

For prerequisites and worked examples, see the
[symbolization guide](/docs/learning-more/symbolization.md#option-1-traceconv-bundle).
Run `trace_processor help bundle` for the complete list of accepted flags,
including common Trace Processor options.

#### Arguments

| Argument | Meaning |
| --- | --- |
| `input` | Input trace file path. Stdin is not supported. |
| `output` | Destination file path. Stdout is not supported. Its parent directory must exist and be writable. |

#### Options

- `--symbol-paths PATH1,PATH2,...`: additional directories to search for native
  symbols (in addition to the auto-discovered ones).
- `--no-auto-symbol-paths`: disable auto-discovery of native symbol paths.
  `--symbol-paths` and `PERFETTO_BINARY_PATH` remain active.
- `--proguard-map [pkg=]PATH`: additional ProGuard/R8 `mapping.txt` to apply for
  Java/Kotlin deobfuscation. Repeat the flag for multiple maps. The optional
  `pkg=` prefix scopes a map to a specific Java package.
- `--no-auto-proguard-maps`: disable auto-discovery of ProGuard/R8 mapping files
  (e.g. the standard Android Gradle layout). Only maps given via
  `--proguard-map` are applied.
- `--verbose`: print every path tried and every library looked up &mdash; useful
  when debugging "could not find" errors.

#### {#symbol-paths} Native symbol paths

A symbol path is a directory containing native binaries with symbols, separate
native debug files, or Breakpad symbol files. It is not a source-code directory
or a ProGuard/R8 mapping file. Native binaries must match the build IDs recorded
in the trace; rebuilding the same source does not necessarily produce a match.

`bundle` recursively indexes native binaries under the configured directories
and matches them by build ID. Their directory layout and filenames need not
match the paths recorded in the trace. For Breakpad, each configured directory
is searched for `<build-id>.breakpad` (the build ID encoded as lowercase hex).

The directory list is assembled from:

1. The comma-separated `--symbol-paths` argument.
2. `PERFETTO_BINARY_PATH`, separated by `:` on POSIX or `;` on Windows.
3. Automatically discovered directories, unless `--no-auto-symbol-paths` is set.

Automatic directories are added in this order, when they exist:

| Directory | Source |
| --- | --- |
| `/usr/lib/debug` | System debug files. |
| `$HOME/.debug` | Per-user debug files. |
| `$ANDROID_PRODUCT_OUT/symbols` | AOSP build output. |
| `./app/build/intermediates/cmake` | Gradle CMake output, relative to the working directory. |
| `./app/build/intermediates/merged_native_libs` | Gradle native libraries, relative to the working directory. |
| `./.build-id` | Local build-ID directory, relative to the working directory. |

With automatic discovery enabled, absolute Unix-style binary paths recorded in
`stack_profile_mapping` are also considered as individual files on the host.
`--no-auto-symbol-paths` disables both these files and the automatic directories;
it does not disable `PERFETTO_BINARY_PATH`.

The order above describes how paths are collected, not a guaranteed preference
between duplicate copies of the same build ID during recursive indexing. Prefer
directories containing the matching unstripped or debug binaries rather than
mixing stripped and unstripped copies. Use `--verbose` to inspect lookup details.

#### Exit status

A successfully written bundle exits with status 0, including when some symbols
are unavailable. The symbolization summary reports missing symbols. Invalid
arguments and failures to produce the bundle exit with a nonzero status.
