Tracing in Background

This document describes how to run Perfetto in the background, allowing you to disconnect from the device and collect the trace file later.

Use Case

Let's say you want to start recording a long-running trace on an Android device or a Linux server, then terminate your adb/ssh shell and come back later to stop the tracing session and collect the trace file. This page shows you how to do this while ensuring the trace remains intact.

To run tracing in the background, use the --background-wait argument with the perfetto command. This will daemonize Perfetto (i.e., run it as a background process) and print its process ID (PID).

NOTE: It's recommended to use --background-wait rather than --background, as the former waits for all data sources to be started before exiting. This ensures that no data is lost at the beginning of the trace.

Usage

Start recording a trace using tracebox or perfetto.

perfetto -c config.cfg --txt -o trace.pftrace --background-wait

This will print the pid of the background perfetto process to stdout.

When you are ready to stop tracing, you need to send a SIGINT or SIGTERM signal to the background Perfetto process. However, simply killing the process creates a race condition: the kill command returns immediately, but Perfetto may still be writing the final parts of the trace file to disk.

If you collect the file too soon, it may be incomplete. To prevent this, you must wait for the close_write event on the trace file, which confirms that Perfetto has finished writing and closed the file. You can achieve this using platform-specific inotify tools.

On Debian Linux we can use inotifywait from the inotify-tools package.

kill <pid> && inotifywait -e close_write trace.pftrace

On Android we can use inotifyd from toybox.

kill <pid> && inotifyd - trace.pftrace:w | head -n0