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