| # 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 — 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. |