xref: /aosp_15_r20/external/perfetto/docs/concepts/detached-mode.md (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker# Running perfetto in detached mode
2*6dbdd20aSAndroid Build Coastguard Worker
3*6dbdd20aSAndroid Build Coastguard WorkerThis document describes the `--detach` and `--attach` advanced operating modes
4*6dbdd20aSAndroid Build Coastguard Workerof the `perfetto` cmdline client.
5*6dbdd20aSAndroid Build Coastguard Worker
6*6dbdd20aSAndroid Build Coastguard WorkerWARNING: The use of `--detach` and `--attach` is highly discouraged because of
7*6dbdd20aSAndroid Build Coastguard Workerthe risk of leaking tracing sessions and accidentally leaving tracing on for
8*6dbdd20aSAndroid Build Coastguard Workerarbitrarily long periods of time.
9*6dbdd20aSAndroid Build Coastguard Worker
10*6dbdd20aSAndroid Build Coastguard WorkerTIP: If what you are looking for is just a way to grab a trace in background
11*6dbdd20aSAndroid Build Coastguard Worker(e.g., while the USB cable / adb is disconnected) from the adb shell simply
12*6dbdd20aSAndroid Build Coastguard Workeruse `--background`.
13*6dbdd20aSAndroid Build Coastguard Worker
14*6dbdd20aSAndroid Build Coastguard Worker## Use case
15*6dbdd20aSAndroid Build Coastguard Worker
16*6dbdd20aSAndroid Build Coastguard WorkerBy default the tracing service `traced` keeps the lifetime of a tracing session
17*6dbdd20aSAndroid Build Coastguard Workerattached to the lifetime of the `perfetto` cmdline client that started it.
18*6dbdd20aSAndroid Build Coastguard WorkerThis means that a `killall perfetto` or `kill $PID_OF_PERFETTO` is sufficient
19*6dbdd20aSAndroid Build Coastguard Workerto guarantee that the tracing session is stopped.
20*6dbdd20aSAndroid Build Coastguard Worker
21*6dbdd20aSAndroid Build Coastguard WorkerThere are rare occasions when this is undesirable; for example, this mode of
22*6dbdd20aSAndroid Build Coastguard Workeroperation was designed for the Traceur app (on-device tracing UI for Android).
23*6dbdd20aSAndroid Build Coastguard Worker
24*6dbdd20aSAndroid Build Coastguard WorkerWhen required by the user, Traceur needs to enable tracing in the background,
25*6dbdd20aSAndroid Build Coastguard Workerpossibly for very long periods of time. Because Traceur is not a persistent service (and even if it was, it could be
26*6dbdd20aSAndroid Build Coastguard Workerstill low-memory-killed), it cannot just use `--background`; this is
27*6dbdd20aSAndroid Build Coastguard Workerbecause the Android framework kills any other process in the same process group
28*6dbdd20aSAndroid Build Coastguard Workerwhen tearing down an app/service, and this would including killing forked
29*6dbdd20aSAndroid Build Coastguard Worker`perfetto` client obtained via `--background`.
30*6dbdd20aSAndroid Build Coastguard Worker
31*6dbdd20aSAndroid Build Coastguard Worker## Operation
32*6dbdd20aSAndroid Build Coastguard Worker
33*6dbdd20aSAndroid Build Coastguard Worker`--detach=key` decouples the lifetime of the cmdline client from the lifetime
34*6dbdd20aSAndroid Build Coastguard Workerof the tracing session.
35*6dbdd20aSAndroid Build Coastguard Worker
36*6dbdd20aSAndroid Build Coastguard WorkerThe `key` argument is an arbitrary string passed by the client to later
37*6dbdd20aSAndroid Build Coastguard Workerre-identify the session using `--attach=key`.
38*6dbdd20aSAndroid Build Coastguard Worker
39*6dbdd20aSAndroid Build Coastguard WorkerOnce detached, the cmdline client will exit (without forking any bg process) and
40*6dbdd20aSAndroid Build Coastguard Workerthe `traced` service will keep the tracing session alive. Because of the exit,
41*6dbdd20aSAndroid Build Coastguard Workera client that wants to use `--detach` needs to set the
42*6dbdd20aSAndroid Build Coastguard Worker[`write_into_file`](config.md#long-traces) option in the trace config, which
43*6dbdd20aSAndroid Build Coastguard Workertransfers the responsibility of writing the output trace file to the
44*6dbdd20aSAndroid Build Coastguard Workerservice (see the [examples](#examples) section).
45*6dbdd20aSAndroid Build Coastguard Worker
46*6dbdd20aSAndroid Build Coastguard WorkerA detached session will run until either:
47*6dbdd20aSAndroid Build Coastguard Worker
48*6dbdd20aSAndroid Build Coastguard Worker- The session is later re-attached and stopped.
49*6dbdd20aSAndroid Build Coastguard Worker- The time limit specified by the `duration_ms` argument in the trace config
50*6dbdd20aSAndroid Build Coastguard Worker  is reached.
51*6dbdd20aSAndroid Build Coastguard Worker
52*6dbdd20aSAndroid Build Coastguard Worker`--attach=key` re-couples the lifetime of a new cmdline client invocation with
53*6dbdd20aSAndroid Build Coastguard Workeran existing tracing session identified by `key`.
54*6dbdd20aSAndroid Build Coastguard WorkerFor security reasons the service allows a client to re-attach to a tracing
55*6dbdd20aSAndroid Build Coastguard Workersession only if the Unix UID of the re-attaching client matches the UID of the
56*6dbdd20aSAndroid Build Coastguard Workerclient that originally started the session and detached.
57*6dbdd20aSAndroid Build Coastguard Worker
58*6dbdd20aSAndroid Build Coastguard WorkerOverall `--attach=key` makes the `perfetto` cmdline client behave as if it was
59*6dbdd20aSAndroid Build Coastguard Workernever detached. This means that:
60*6dbdd20aSAndroid Build Coastguard Worker
61*6dbdd20aSAndroid Build Coastguard Worker- sending a `SIGKILL` (or Ctrl-C) to the client will gracefully stop the tracing
62*6dbdd20aSAndroid Build Coastguard Worker  session.
63*6dbdd20aSAndroid Build Coastguard Worker- If the `duration_ms` time limit is hit, the client will be informed by the
64*6dbdd20aSAndroid Build Coastguard Worker  service and exit soon after.
65*6dbdd20aSAndroid Build Coastguard Worker
66*6dbdd20aSAndroid Build Coastguard WorkerWhen re-attaching it is possible to also specify a further `--stop` argument.
67*6dbdd20aSAndroid Build Coastguard Worker`--stop` will gracefully terminate the tracing session immediately after
68*6dbdd20aSAndroid Build Coastguard Workerre-attaching (This is to avoid a race where SIGKILL is sent too early, before
69*6dbdd20aSAndroid Build Coastguard Workerthe client gets a chance to attach or even register the signal handler).
70*6dbdd20aSAndroid Build Coastguard Worker
71*6dbdd20aSAndroid Build Coastguard WorkerNo other cmdline argument other than `--stop` can be passed when using
72*6dbdd20aSAndroid Build Coastguard Worker`--attach`.
73*6dbdd20aSAndroid Build Coastguard Worker
74*6dbdd20aSAndroid Build Coastguard Worker`--is_detached=key` can be used to check whether a detached session is running.
75*6dbdd20aSAndroid Build Coastguard WorkerThe cmdline client will return quickly after the invocation with the following
76*6dbdd20aSAndroid Build Coastguard Workerexit code:
77*6dbdd20aSAndroid Build Coastguard Worker
78*6dbdd20aSAndroid Build Coastguard Worker- 0 if the session identified by `key` exists and can be re-attached.
79*6dbdd20aSAndroid Build Coastguard Worker- 1 in case of a general error (e.g. wrong cmdline, cannot reach the service).
80*6dbdd20aSAndroid Build Coastguard Worker- 2 if no detached session with the given `key` is found.
81*6dbdd20aSAndroid Build Coastguard Worker
82*6dbdd20aSAndroid Build Coastguard Worker## Examples
83*6dbdd20aSAndroid Build Coastguard Worker
84*6dbdd20aSAndroid Build Coastguard Worker### Capturing a long trace in detached mode
85*6dbdd20aSAndroid Build Coastguard Worker
86*6dbdd20aSAndroid Build Coastguard Worker```bash
87*6dbdd20aSAndroid Build Coastguard Workerecho '
88*6dbdd20aSAndroid Build Coastguard Workerwrite_into_file: true
89*6dbdd20aSAndroid Build Coastguard Worker# Long tracing mode, periodically flush the trace buffer into the trace file.
90*6dbdd20aSAndroid Build Coastguard Workerfile_write_period_ms: 5000
91*6dbdd20aSAndroid Build Coastguard Worker
92*6dbdd20aSAndroid Build Coastguard Workerbuffers {
93*6dbdd20aSAndroid Build Coastguard Worker  # This buffer needs to be big enough just to hold data between two consecutive
94*6dbdd20aSAndroid Build Coastguard Worker  # |file_write_period|s (5s in this examples).
95*6dbdd20aSAndroid Build Coastguard Worker  size_kb: 16384
96*6dbdd20aSAndroid Build Coastguard Worker}
97*6dbdd20aSAndroid Build Coastguard Worker
98*6dbdd20aSAndroid Build Coastguard Workerdata_sources {
99*6dbdd20aSAndroid Build Coastguard Worker  config {
100*6dbdd20aSAndroid Build Coastguard Worker    name: "linux.ftrace"
101*6dbdd20aSAndroid Build Coastguard Worker    ftrace_config {
102*6dbdd20aSAndroid Build Coastguard Worker      ftrace_events: "sched_switch"
103*6dbdd20aSAndroid Build Coastguard Worker    }
104*6dbdd20aSAndroid Build Coastguard Worker  }
105*6dbdd20aSAndroid Build Coastguard Worker}
106*6dbdd20aSAndroid Build Coastguard Worker' | perfetto -c - --txt --detach=session1 -o /data/misc/perfetto-traces/trace
107*6dbdd20aSAndroid Build Coastguard Worker
108*6dbdd20aSAndroid Build Coastguard Workersleep 60
109*6dbdd20aSAndroid Build Coastguard Worker
110*6dbdd20aSAndroid Build Coastguard Workerperfetto --attach=session1 --stop
111*6dbdd20aSAndroid Build Coastguard Worker# At this point the trace file is fully flushed into
112*6dbdd20aSAndroid Build Coastguard Worker# /data/misc/perfetto-traces/trace.
113*6dbdd20aSAndroid Build Coastguard Worker```
114*6dbdd20aSAndroid Build Coastguard Worker
115*6dbdd20aSAndroid Build Coastguard Worker### Start in detached ring-buffer mode. Later stop and save the ring buffer
116*6dbdd20aSAndroid Build Coastguard Worker
117*6dbdd20aSAndroid Build Coastguard Worker```bash
118*6dbdd20aSAndroid Build Coastguard Workerecho '
119*6dbdd20aSAndroid Build Coastguard Workerwrite_into_file: true
120*6dbdd20aSAndroid Build Coastguard Worker
121*6dbdd20aSAndroid Build Coastguard Worker# Specify an arbitrarily long flush period. Practically this means: never flush
122*6dbdd20aSAndroid Build Coastguard Worker# unless trace is stopped.
123*6dbdd20aSAndroid Build Coastguard Worker# TODO(primiano): an explicit no_periodic_flushes argument would be nicer. Maybe
124*6dbdd20aSAndroid Build Coastguard Worker# we could repurpose the 0 value?
125*6dbdd20aSAndroid Build Coastguard Workerfile_write_period_ms: 1000000000
126*6dbdd20aSAndroid Build Coastguard Worker
127*6dbdd20aSAndroid Build Coastguard Workerbuffers {
128*6dbdd20aSAndroid Build Coastguard Worker  # This will be the size of the final trace.
129*6dbdd20aSAndroid Build Coastguard Worker  size_kb: 16384
130*6dbdd20aSAndroid Build Coastguard Worker}
131*6dbdd20aSAndroid Build Coastguard Worker
132*6dbdd20aSAndroid Build Coastguard Workerdata_sources {
133*6dbdd20aSAndroid Build Coastguard Worker  config {
134*6dbdd20aSAndroid Build Coastguard Worker    name: "linux.ftrace"
135*6dbdd20aSAndroid Build Coastguard Worker    ftrace_config {
136*6dbdd20aSAndroid Build Coastguard Worker      ftrace_events: "sched_switch"
137*6dbdd20aSAndroid Build Coastguard Worker    }
138*6dbdd20aSAndroid Build Coastguard Worker  }
139*6dbdd20aSAndroid Build Coastguard Worker}
140*6dbdd20aSAndroid Build Coastguard Worker' | perfetto -c - --txt --detach=session2 -o /data/misc/perfetto-traces/trace
141*6dbdd20aSAndroid Build Coastguard Worker
142*6dbdd20aSAndroid Build Coastguard Worker# Wait for user input, or some critical event to happen.
143*6dbdd20aSAndroid Build Coastguard Worker
144*6dbdd20aSAndroid Build Coastguard Workerperfetto --attach=session2 --stop
145*6dbdd20aSAndroid Build Coastguard Worker
146*6dbdd20aSAndroid Build Coastguard Worker# At this point the trace file is saved into
147*6dbdd20aSAndroid Build Coastguard Worker# /data/misc/perfetto-traces/trace.
148*6dbdd20aSAndroid Build Coastguard Worker```
149*6dbdd20aSAndroid Build Coastguard Worker
150*6dbdd20aSAndroid Build Coastguard Worker### Start tracing with a time limit. Later re-attach and wait for the end
151*6dbdd20aSAndroid Build Coastguard Worker
152*6dbdd20aSAndroid Build Coastguard Worker```bash
153*6dbdd20aSAndroid Build Coastguard Workerecho '
154*6dbdd20aSAndroid Build Coastguard Workerduration_ms: 10000
155*6dbdd20aSAndroid Build Coastguard Workerwrite_into_file: true
156*6dbdd20aSAndroid Build Coastguard Worker
157*6dbdd20aSAndroid Build Coastguard Workerbuffers {
158*6dbdd20aSAndroid Build Coastguard Worker  size_kb: 16384
159*6dbdd20aSAndroid Build Coastguard Worker}
160*6dbdd20aSAndroid Build Coastguard Worker
161*6dbdd20aSAndroid Build Coastguard Workerdata_sources {
162*6dbdd20aSAndroid Build Coastguard Worker  config {
163*6dbdd20aSAndroid Build Coastguard Worker    name: "linux.ftrace"
164*6dbdd20aSAndroid Build Coastguard Worker    ftrace_config {
165*6dbdd20aSAndroid Build Coastguard Worker      ftrace_events: "sched_switch"
166*6dbdd20aSAndroid Build Coastguard Worker    }
167*6dbdd20aSAndroid Build Coastguard Worker  }
168*6dbdd20aSAndroid Build Coastguard Worker}
169*6dbdd20aSAndroid Build Coastguard Worker' | perfetto -c - --txt --detach=session3 -o /data/misc/perfetto-traces/trace
170*6dbdd20aSAndroid Build Coastguard Worker
171*6dbdd20aSAndroid Build Coastguard Workersleep 3
172*6dbdd20aSAndroid Build Coastguard Workerperfetto --attach=session3
173*6dbdd20aSAndroid Build Coastguard Worker# The cmdline client will stay up for 7 more seconds and then terminate.
174*6dbdd20aSAndroid Build Coastguard Worker```
175