You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
175 lines
5.5 KiB
175 lines
5.5 KiB
# Running perfetto in detached mode
|
|
|
|
This document describes the `--detach` and `--attach` advanced operating modes
|
|
of the `perfetto` cmdline client.
|
|
|
|
WARNING: The use of `--detach` and `--attach` is highly discouraged because of
|
|
the risk of leaking tracing sessions and accidentally leaving tracing on for
|
|
arbitrarily long periods of time.
|
|
|
|
TIP: If what you are looking for is just a way to grab a trace in background
|
|
(e.g., while the USB cable / adb is disconnected) from the adb shell simply
|
|
use `--background`.
|
|
|
|
## Use case
|
|
|
|
By default the tracing service `traced` keeps the lifetime of a tracing session
|
|
attached to the lifetime of the `perfetto` cmdline client that started it.
|
|
This means that a `killall perfetto` or `kill $PID_OF_PERFETTO` is sufficient
|
|
to guarantee that the tracing session is stopped.
|
|
|
|
There are rare occasions when this is undesirable; for example, this mode of
|
|
operation was designed for the Traceur app (on-device tracing UI for Android).
|
|
|
|
When required by the user, Traceur needs to enable tracing in the background,
|
|
possibly for very long periods of time. Because Traceur is not a persistent service (and even if it was, it could be
|
|
still low-memory-killed), it cannot just use `--background`; this is
|
|
because the Android framework kills any other process in the same process group
|
|
when tearing down an app/service, and this would including killing forked
|
|
`perfetto` client obtained via `--background`.
|
|
|
|
## Operation
|
|
|
|
`--detach=key` decouples the lifetime of the cmdline client from the lifetime
|
|
of the tracing session.
|
|
|
|
The `key` argument is an arbitrary string passed by the client to later
|
|
re-identify the session using `--attach=key`.
|
|
|
|
Once detached, the cmdline client will exit (without forking any bg process) and
|
|
the `traced` service will keep the tracing session alive. Because of the exit,
|
|
a client that wants to use `--detach` needs to set the
|
|
[`write_into_file`](config.md#long-traces) option in the trace config, which
|
|
transfers the responsibility of writing the output trace file to the
|
|
service (see the [examples](#examples) section).
|
|
|
|
A detached session will run until either:
|
|
|
|
- The session is later re-attached and stopped.
|
|
- The time limit specified by the `duration_ms` argument in the trace config
|
|
is reached.
|
|
|
|
`--attach=key` re-couples the lifetime of a new cmdline client invocation with
|
|
an existing tracing session identified by `key`.
|
|
For security reasons the service allows a client to re-attach to a tracing
|
|
session only if the Unix UID of the re-attaching client matches the UID of the
|
|
client that originally started the session and detached.
|
|
|
|
Overall `--attach=key` makes the `perfetto` cmdline client behave as if it was
|
|
never detached. This means that:
|
|
|
|
- sending a `SIGKILL` (or Ctrl-C) to the client will gracefully stop the tracing
|
|
session.
|
|
- If the `duration_ms` time limit is hit, the client will be informed by the
|
|
service and exit soon after.
|
|
|
|
When re-attaching it is possible to also specify a further `--stop` argument.
|
|
`--stop` will gracefully terminate the tracing session immediately after
|
|
re-attaching (This is to avoid a race where SIGKILL is sent too early, before
|
|
the client gets a chance to attach or even register the signal handler).
|
|
|
|
No other cmdline argument other than `--stop` can be passed when using
|
|
`--attach`.
|
|
|
|
`--is_detached=key` can be used to check whether a detached session is running.
|
|
The cmdline client will return quickly after the invocation with the following
|
|
exit code:
|
|
|
|
- 0 if the session identified by `key` exists and can be re-attached.
|
|
- 1 in case of a general error (e.g. wrong cmdline, cannot reach the service).
|
|
- 2 if no detached session with the given `key` is found.
|
|
|
|
## Examples
|
|
|
|
### Capturing a long trace in detached mode
|
|
|
|
```bash
|
|
echo '
|
|
write_into_file: true
|
|
# Long tracing mode, periodically flush the trace buffer into the trace file.
|
|
file_write_period_ms: 5000
|
|
|
|
buffers {
|
|
# This buffer needs to be big enough just to hold data between two consecutive
|
|
# |file_write_period|s (5s in this examples).
|
|
size_kb: 16384
|
|
}
|
|
|
|
data_sources {
|
|
config {
|
|
name: "linux.ftrace"
|
|
ftrace_config {
|
|
ftrace_events: "sched_switch"
|
|
}
|
|
}
|
|
}
|
|
' | perfetto -c - --txt --detach=session1 -o /data/misc/perfetto-traces/trace
|
|
|
|
sleep 60
|
|
|
|
perfetto --attach=session1 --stop
|
|
# At this point the trace file is fully flushed into
|
|
# /data/misc/perfetto-traces/trace.
|
|
```
|
|
|
|
### Start in detached ring-buffer mode. Later stop and save the ring buffer
|
|
|
|
```bash
|
|
echo '
|
|
write_into_file: true
|
|
|
|
# Specify an arbitrarily long flush period. Practically this means: never flush
|
|
# unless trace is stopped.
|
|
# TODO(primiano): an explicit no_periodic_flushes argument would be nicer. Maybe
|
|
# we could repurpose the 0 value?
|
|
file_write_period_ms: 1000000000
|
|
|
|
buffers {
|
|
# This will be the size of the final trace.
|
|
size_kb: 16384
|
|
}
|
|
|
|
data_sources {
|
|
config {
|
|
name: "linux.ftrace"
|
|
ftrace_config {
|
|
ftrace_events: "sched_switch"
|
|
}
|
|
}
|
|
}
|
|
' | perfetto -c - --txt --detach=session2 -o /data/misc/perfetto-traces/trace
|
|
|
|
# Wait for user input, or some critical event to happen.
|
|
|
|
perfetto --attach=session2 --stop
|
|
|
|
# At this point the trace file is saved into
|
|
# /data/misc/perfetto-traces/trace.
|
|
```
|
|
|
|
### Start tracing with a time limit. Later re-attach and wait for the end
|
|
|
|
```bash
|
|
echo '
|
|
duration_ms: 10000
|
|
write_into_file: true
|
|
|
|
buffers {
|
|
size_kb: 16384
|
|
}
|
|
|
|
data_sources {
|
|
config {
|
|
name: "linux.ftrace"
|
|
ftrace_config {
|
|
ftrace_events: "sched_switch"
|
|
}
|
|
}
|
|
}
|
|
' | perfetto -c - --txt --detach=session3 -o /data/misc/perfetto-traces/trace
|
|
|
|
sleep 3
|
|
perfetto --attach=session3
|
|
# The cmdline client will stay up for 7 more seconds and then terminate.
|
|
```
|