1#!/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 16CUR_DIR="$(realpath "$(dirname "${BASH_SOURCE[0]}")")" 17 18export PATH="$PATH:$CUR_DIR" 19 20if [ "$TMPDIR" == "" ]; then 21 TMPDIR=/tmp 22fi 23 24function is_monolithic { 25 local out=$1 26 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 33 return $? 34} 35 36function is_mac { 37 ! test -d /proc 38 return $? 39} 40 41function reset_tracing { 42 if is_android $OUT; then 43 adb shell 'echo 0 > /d/tracing/tracing_on' 44 elif ! is_mac; then 45 if [ ! -w /sys/kernel/debug ]; then 46 echo "debugfs not accessible, try sudo chown -R $USER /sys/kernel/debug" 47 sudo chown -R $USER /sys/kernel/debug 48 fi 49 50 echo 0 > /sys/kernel/debug/tracing/tracing_on 51 fi 52} 53 54function adb_supports_push_sync { 55 adb --help 2>&1 | grep 'push.*\[--sync\]' 2>&1 >/dev/null 56} 57 58function push { 59 if is_android $OUT; then 60 local maybe_sync='' 61 if adb_supports_push_sync; then 62 maybe_sync='--sync ' 63 fi 64 echo adb push $maybe_sync $1 $DIR 65 adb push $maybe_sync $1 $DIR 66 else 67 echo cp $1 $DIR 68 cp $1 $DIR 69 fi 70} 71 72function pull { 73 if is_android $OUT; then 74 echo adb pull $DIR/$1 $2 75 adb pull $DIR/$1 $2 76 else 77 echo mv $DIR/$1 $2 78 mv $DIR/$1 $2 79 fi 80} 81 82background=0 83 84while getopts b o; do 85 case "$o" in 86 b) background=1;; 87 *) echo "Invalid option $o"; exit;; 88 esac 89done 90 91# If not set guess the OUT dir using the latest directory. 92if [ ! -f "$OUT/args.gn" ]; then 93 echo "OUT=$OUT doesn't look like an output directory." 94 echo "Please specify a directory by doing: export OUT=out/xxx" 95 exit 1 96fi 97 98# You can set the config to one of the files under test/configs e.g. 99# CONFIG=ftrace.cfg or to :test. Defaults to :test. 100CONFIG="${CONFIG:-:test}" 101 102if is_android $OUT ; then 103 DIR=/data/local/tmp 104elif is_mac; then 105 DIR=$(mktemp -d $TMPDIR/perfetto.XXXXXX) 106else 107 DIR=$(mktemp -p $TMPDIR -d perfetto.XXXXXX) 108fi 109 110tools/ninja -C $OUT traced traced_probes perfetto trace_to_text test/configs 111 112push $OUT/traced 113push $OUT/traced_probes 114push $OUT/perfetto 115reset_tracing 116 117if is_android $OUT; then 118 PREFIX="PERFETTO_CONSUMER_SOCK_NAME=@perfetto_test_consumer PERFETTO_PRODUCER_SOCK_NAME=@perfetto_test_producer" 119else 120 PREFIX="" 121fi 122 123if ! is_monolithic $OUT; then 124 PREFIX="$PREFIX LD_LIBRARY_PATH=$DIR" 125 push $OUT/libperfetto.so 126fi 127 128CONFIG_DEVICE_PATH="$CONFIG" 129CMD_OPTS="" 130if [[ "$CONFIG" == *.protobuf ]]; then 131 CONFIG_DEVICE_PATH="$CONFIG" 132 CONFIG_PATH=$OUT/$CONFIG; 133 if [[ ! -f $CONFIG_PATH ]]; then 134 echo 'Config "'$CONFIG_PATH'" not known.' 135 exit 1 136 fi 137 push $CONFIG_PATH 138elif [[ "$CONFIG" != ":test" ]]; then 139 CONFIG_DEVICE_PATH="$(basename $CONFIG)" 140 CONFIG_PATH=test/configs/$CONFIG 141 # Check if this is a valid absolute path 142 if [[ ! -f $CONFIG_PATH ]]; then 143 CONFIG_PATH=$CONFIG 144 if [[ ! -f $CONFIG_PATH ]]; then 145 echo 'Config "'$CONFIG'" not known.' 146 exit 1 147 fi 148 fi 149 CMD_OPTS="--txt $CMD_OPTS" 150 push $CONFIG_PATH 151fi 152 153POSTFIX="" 154 155if [[ background -eq 1 ]]; then 156 PREFIX="$PREFIX nohup" 157 POSTFIX=" &> /dev/null &" 158fi 159 160if tmux has-session -t demo; then 161 tmux kill-session -t demo 162fi 163tmux -2 new-session -d -s demo 164 165if tmux -V | awk '{split($2, ver, "."); if (ver[1] < 2) exit 1 ; else if (ver[1] == 2 && ver[2] < 1) exit 1 }'; then 166 tmux set-option -g mouse on 167else 168 tmux set-option -g mode-mouse on 169 tmux set-option -g mouse-resize-pane on 170 tmux set-option -g mouse-select-pane on 171 tmux set-option -g mouse-select-window on 172fi 173 174tmux split-window -v 175tmux split-window -v 176 177tmux select-layout even-vertical 178 179tmux select-pane -t 0 180tmux send-keys "clear" C-m 181if is_android $OUT; then 182 tmux send-keys "adb shell" C-m 183fi 184 185tmux select-pane -t 1 186tmux send-keys "clear" C-m 187if is_android $OUT; then 188 tmux send-keys "adb shell" C-m 189fi 190 191tmux select-pane -t 2 192tmux send-keys "clear" C-m 193if is_android $OUT; then 194 tmux send-keys "adb shell" C-m 195fi 196 197sleep 2 198 199tmux select-pane -t 1 200tmux send-keys "PS1='[traced_probes]$ '" Enter 201tmux send-keys "cd $DIR" Enter 202tmux send-keys "$PREFIX ./traced $POSTFIX" Enter 203 204tmux select-pane -t 0 205tmux send-keys "PS1='[traced]$ '" Enter 206tmux send-keys "cd $DIR" Enter 207tmux send-keys "$PREFIX PERFETTO_METATRACE_FILE=mtrace ./traced_probes $POSTFIX" Enter 208 209tmux select-pane -t 2 210tmux send-keys "PS1='[consumer]$ '" Enter 211tmux send-keys "cd $DIR" Enter 212tmux send-keys "$PREFIX ./perfetto $CMD_OPTS -c $CONFIG_DEVICE_PATH -o trace $POSTFIX" 213 214# Select consumer pane. 215tmux select-pane -t 2 216 217tmux -2 attach-session -t demo 218if [[ background -eq 1 ]]; then 219 exit 0; 220fi 221 222reset_tracing 223 224TRACE=$HOME/Downloads/trace 225pull trace /tmp/trace.protobuf 226echo -e "\n\x1b[32mPulling trace into $TRACE.pbtext\x1b[0m" 227$OUT/trace_to_text text < /tmp/trace.protobuf > $TRACE.pbtext 228echo -e "\n\x1b[32mPulling trace into $TRACE.json\x1b[0m" 229$OUT/trace_to_text systrace < /tmp/trace.protobuf > $TRACE.json 230# Keep this last so it can fail. 231pull mtrace /tmp/mtrace.json 232# Add [ to beginning of file and replace trailing , with ] to turn into valid 233# JSON array. 234sed -i -e '$ s/.$/]/' /tmp/mtrace.json 235sed -i -e '1s/^/[/' /tmp/mtrace.json 236