blob: da67d2e3dcee19a162bf235153ece72d3c8f7649 [file] [log] [blame]
Primiano Tuccib7cca202018-01-29 16:30:47 +00001#!/bin/bash
2# Copyright (C) 2018 The Android Open Source Project
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15set -e
Joel Fernandes16e86102019-03-19 13:42:48 -040016CUR_DIR="$(realpath "$(dirname "${BASH_SOURCE[0]}")")"
17
18export PATH="$PATH:$CUR_DIR"
Primiano Tuccib7cca202018-01-29 16:30:47 +000019
Primiano Tucci2ffd1a52018-03-27 01:01:30 +010020if [ "$TMPDIR" == "" ]; then
21 TMPDIR=/tmp
22fi
23
Hector Dearman9b89d472018-02-28 12:07:21 +000024function is_monolithic {
Hector Dearmanc9c183a2018-02-08 12:01:12 +000025 local out=$1
Hector Dearmanc067d412018-03-16 17:01:41 +000026 gn args $out --list --short | grep 'monolithic_binaries = true' 2>&1 >/dev/null
27 return $?
28}
29
30function is_android {
31 local out=$1
32 gn args $out --list --short | grep 'target_os = "android"' 2>&1 >/dev/null
Hector Dearmanc9c183a2018-02-08 12:01:12 +000033 return $?
34}
35
Primiano Tucci676f0cc2018-12-03 20:03:26 +010036function is_mac {
37 ! test -d /proc
38 return $?
39}
40
Hector Dearman2407cdd2019-06-04 13:21:34 +010041function tmux_ensure_bash {
42 if [[ $SHELL == *"fish" ]]; then
43 tmux send-keys "bash" Enter
44 fi
45}
46
Hector Dearman0ff07c72018-03-15 09:54:46 +000047function reset_tracing {
Primiano Tucci2ffd1a52018-03-27 01:01:30 +010048 if is_android $OUT; then
49 adb shell 'echo 0 > /d/tracing/tracing_on'
Primiano Tucci676f0cc2018-12-03 20:03:26 +010050 elif ! is_mac; then
Primiano Tucci2ffd1a52018-03-27 01:01:30 +010051 if [ ! -w /sys/kernel/debug ]; then
52 echo "debugfs not accessible, try sudo chown -R $USER /sys/kernel/debug"
53 sudo chown -R $USER /sys/kernel/debug
54 fi
55
56 echo 0 > /sys/kernel/debug/tracing/tracing_on
57 fi
Hector Dearman0ff07c72018-03-15 09:54:46 +000058}
59
Hector Dearman9b89d472018-02-28 12:07:21 +000060function adb_supports_push_sync {
Primiano Tuccifd8240d2018-08-01 09:34:54 +010061 adb --help 2>&1 | grep 'push.*\[--sync\]' 2>&1 >/dev/null
Hector Dearmanc067d412018-03-16 17:01:41 +000062}
63
Hector Dearman9b89d472018-02-28 12:07:21 +000064function push {
Hector Dearmanc067d412018-03-16 17:01:41 +000065 if is_android $OUT; then
66 local maybe_sync=''
67 if adb_supports_push_sync; then
68 maybe_sync='--sync '
69 fi
70 echo adb push $maybe_sync $1 $DIR
71 adb push $maybe_sync $1 $DIR
72 else
73 echo cp $1 $DIR
74 cp $1 $DIR
Hector Dearman9b89d472018-02-28 12:07:21 +000075 fi
Hector Dearmanc067d412018-03-16 17:01:41 +000076}
77
78function pull {
79 if is_android $OUT; then
80 echo adb pull $DIR/$1 $2
81 adb pull $DIR/$1 $2
82 else
Primiano Tucci2ffd1a52018-03-27 01:01:30 +010083 echo mv $DIR/$1 $2
84 mv $DIR/$1 $2
Hector Dearmanc067d412018-03-16 17:01:41 +000085 fi
Hector Dearman9b89d472018-02-28 12:07:21 +000086}
87
Florian Mayerb8433222018-05-15 11:29:18 +010088background=0
89
90while getopts b o; do
91 case "$o" in
92 b) background=1;;
93 *) echo "Invalid option $o"; exit;;
94 esac
95done
96
Primiano Tuccib7cca202018-01-29 16:30:47 +000097# If not set guess the OUT dir using the latest directory.
98if [ ! -f "$OUT/args.gn" ]; then
99 echo "OUT=$OUT doesn't look like an output directory."
100 echo "Please specify a directory by doing: export OUT=out/xxx"
101 exit 1
102fi
103
Hector Dearmanc88a66d2018-02-01 14:07:14 +0000104# You can set the config to one of the files under test/configs e.g.
105# CONFIG=ftrace.cfg or to :test. Defaults to :test.
106CONFIG="${CONFIG:-:test}"
107
Hector Dearmanc067d412018-03-16 17:01:41 +0000108if is_android $OUT ; then
109 DIR=/data/local/tmp
Primiano Tucci676f0cc2018-12-03 20:03:26 +0100110elif is_mac; then
111 DIR=$(mktemp -d $TMPDIR/perfetto.XXXXXX)
Hector Dearmanc067d412018-03-16 17:01:41 +0000112else
Primiano Tucci2ffd1a52018-03-27 01:01:30 +0100113 DIR=$(mktemp -p $TMPDIR -d perfetto.XXXXXX)
Hector Dearmanc067d412018-03-16 17:01:41 +0000114fi
115
Lalit Magantic27975c2018-04-10 21:42:18 +0100116tools/ninja -C $OUT traced traced_probes perfetto trace_to_text test/configs
Primiano Tuccib7cca202018-01-29 16:30:47 +0000117
Hector Dearmanc067d412018-03-16 17:01:41 +0000118push $OUT/traced
119push $OUT/traced_probes
120push $OUT/perfetto
Hector Dearman0ff07c72018-03-15 09:54:46 +0000121reset_tracing
Primiano Tuccib7cca202018-01-29 16:30:47 +0000122
Florian Mayerb0f00712018-04-04 16:35:45 +0100123if is_android $OUT; then
Primiano Tucci301175d2019-01-11 10:10:21 +0000124 PREFIX="PERFETTO_CONSUMER_SOCK_NAME=@perfetto_test_consumer PERFETTO_PRODUCER_SOCK_NAME=@perfetto_test_producer"
Florian Mayerb0f00712018-04-04 16:35:45 +0100125else
126 PREFIX=""
127fi
128
Hector Dearmanc067d412018-03-16 17:01:41 +0000129if ! is_monolithic $OUT; then
Florian Mayerb0f00712018-04-04 16:35:45 +0100130 PREFIX="$PREFIX LD_LIBRARY_PATH=$DIR"
Primiano Tuccibdb2a592018-10-11 15:59:29 +0100131 push $OUT/libperfetto.so
Hector Dearmanc9c183a2018-02-08 12:01:12 +0000132fi
133
Primiano Tucci9ba1d842018-12-20 17:31:04 +0100134CONFIG_DEVICE_PATH="$CONFIG"
Hector Dearmanb7fa5442018-11-08 18:39:32 +0000135CMD_OPTS=""
136if [[ "$CONFIG" == *.protobuf ]]; then
Hector Dearman696ff772019-04-23 18:38:53 +0100137 CONFIG_DEVICE_PATH="$CONFIG"
138 CONFIG_PATH=$OUT/$CONFIG;
Hector Dearmanc88a66d2018-02-01 14:07:14 +0000139 if [[ ! -f $CONFIG_PATH ]]; then
140 echo 'Config "'$CONFIG_PATH'" not known.'
141 exit 1
142 fi
Hector Dearmanc067d412018-03-16 17:01:41 +0000143 push $CONFIG_PATH
Hector Dearmanb7fa5442018-11-08 18:39:32 +0000144elif [[ "$CONFIG" != ":test" ]]; then
Ioannis Ilkos482264e2019-01-15 10:46:11 +0000145 CONFIG_DEVICE_PATH="$(basename $CONFIG)"
146 CONFIG_PATH=test/configs/$CONFIG
147 # Check if this is a valid absolute path
Hector Dearmanb7fa5442018-11-08 18:39:32 +0000148 if [[ ! -f $CONFIG_PATH ]]; then
Ioannis Ilkos482264e2019-01-15 10:46:11 +0000149 CONFIG_PATH=$CONFIG
150 if [[ ! -f $CONFIG_PATH ]]; then
151 echo 'Config "'$CONFIG'" not known.'
152 exit 1
153 fi
Hector Dearmanb7fa5442018-11-08 18:39:32 +0000154 fi
155 CMD_OPTS="--txt $CMD_OPTS"
156 push $CONFIG_PATH
Hector Dearmanc88a66d2018-02-01 14:07:14 +0000157fi
158
Florian Mayerb8433222018-05-15 11:29:18 +0100159POSTFIX=""
160
161if [[ background -eq 1 ]]; then
162 PREFIX="$PREFIX nohup"
163 POSTFIX=" &> /dev/null &"
164fi
165
Primiano Tuccib7cca202018-01-29 16:30:47 +0000166if tmux has-session -t demo; then
167 tmux kill-session -t demo
168fi
169tmux -2 new-session -d -s demo
170
171if tmux -V | awk '{split($2, ver, "."); if (ver[1] < 2) exit 1 ; else if (ver[1] == 2 && ver[2] < 1) exit 1 }'; then
172 tmux set-option -g mouse on
173else
174 tmux set-option -g mode-mouse on
175 tmux set-option -g mouse-resize-pane on
176 tmux set-option -g mouse-select-pane on
177 tmux set-option -g mouse-select-window on
178fi
179
180tmux split-window -v
181tmux split-window -v
182
183tmux select-layout even-vertical
184
185tmux select-pane -t 0
186tmux send-keys "clear" C-m
Hector Dearmanc067d412018-03-16 17:01:41 +0000187if is_android $OUT; then
188 tmux send-keys "adb shell" C-m
189fi
Primiano Tuccib7cca202018-01-29 16:30:47 +0000190
191tmux select-pane -t 1
192tmux send-keys "clear" C-m
Hector Dearmanc067d412018-03-16 17:01:41 +0000193if is_android $OUT; then
194 tmux send-keys "adb shell" C-m
195fi
Primiano Tuccib7cca202018-01-29 16:30:47 +0000196
197tmux select-pane -t 2
198tmux send-keys "clear" C-m
Hector Dearmanc067d412018-03-16 17:01:41 +0000199if is_android $OUT; then
200 tmux send-keys "adb shell" C-m
201fi
Primiano Tuccib7cca202018-01-29 16:30:47 +0000202
Hector Dearmanc88a66d2018-02-01 14:07:14 +0000203sleep 2
Primiano Tuccib7cca202018-01-29 16:30:47 +0000204
205tmux select-pane -t 1
Hector Dearman2407cdd2019-06-04 13:21:34 +0100206tmux_ensure_bash
Primiano Tucci9ba1d842018-12-20 17:31:04 +0100207tmux send-keys "PS1='[traced_probes]$ '" Enter
208tmux send-keys "cd $DIR" Enter
209tmux send-keys "$PREFIX ./traced $POSTFIX" Enter
Primiano Tuccib7cca202018-01-29 16:30:47 +0000210
Primiano Tuccib7cca202018-01-29 16:30:47 +0000211tmux select-pane -t 0
Hector Dearman2407cdd2019-06-04 13:21:34 +0100212tmux_ensure_bash
Primiano Tucci9ba1d842018-12-20 17:31:04 +0100213tmux send-keys "PS1='[traced]$ '" Enter
214tmux send-keys "cd $DIR" Enter
215tmux send-keys "$PREFIX PERFETTO_METATRACE_FILE=mtrace ./traced_probes $POSTFIX" Enter
Primiano Tuccib7cca202018-01-29 16:30:47 +0000216
217tmux select-pane -t 2
Hector Dearman2407cdd2019-06-04 13:21:34 +0100218tmux_ensure_bash
Primiano Tucci9ba1d842018-12-20 17:31:04 +0100219tmux send-keys "PS1='[consumer]$ '" Enter
220tmux send-keys "cd $DIR" Enter
221tmux send-keys "$PREFIX ./perfetto $CMD_OPTS -c $CONFIG_DEVICE_PATH -o trace $POSTFIX"
Primiano Tuccib7cca202018-01-29 16:30:47 +0000222
223# Select consumer pane.
224tmux select-pane -t 2
225
226tmux -2 attach-session -t demo
Florian Mayerb8433222018-05-15 11:29:18 +0100227if [[ background -eq 1 ]]; then
228 exit 0;
229fi
Hector Dearmana7c04f82018-03-29 11:31:24 +0100230
Hector Dearman3c4e5c22018-03-29 11:31:55 +0100231reset_tracing
Hector Dearmana7c04f82018-03-29 11:31:24 +0100232
233TRACE=$HOME/Downloads/trace
234pull trace /tmp/trace.protobuf
Florian Mayerb8433222018-05-15 11:29:18 +0100235echo -e "\n\x1b[32mPulling trace into $TRACE.pbtext\x1b[0m"
236$OUT/trace_to_text text < /tmp/trace.protobuf > $TRACE.pbtext
237echo -e "\n\x1b[32mPulling trace into $TRACE.json\x1b[0m"
238$OUT/trace_to_text systrace < /tmp/trace.protobuf > $TRACE.json
239# Keep this last so it can fail.
Florian Mayer236ba472018-05-09 15:47:53 +0100240pull mtrace /tmp/mtrace.json
241# Add [ to beginning of file and replace trailing , with ] to turn into valid
242# JSON array.
Primiano Tucci89d1ad22018-10-31 21:42:36 -0700243sed -i -e '$ s/.$/]/' /tmp/mtrace.json
244sed -i -e '1s/^/[/' /tmp/mtrace.json