#!/bin/bash # Copyright (C) 2018 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set -e CUR_DIR="$(realpath "$(dirname "${BASH_SOURCE[0]}")")" export PATH="$PATH:$CUR_DIR" if [ "$TMPDIR" == "" ]; then TMPDIR=/tmp fi function is_monolithic { local out=$1 gn args $out --list --short | grep 'monolithic_binaries = true' 2>&1 >/dev/null return $? } function is_android { local out=$1 gn args $out --list --short | grep 'target_os = "android"' 2>&1 >/dev/null return $? } function is_mac { ! test -d /proc return $? } function reset_tracing { if is_android $OUT; then adb shell 'echo 0 > /d/tracing/tracing_on' elif ! is_mac; then if [ ! -w /sys/kernel/debug ]; then echo "debugfs not accessible, try sudo chown -R $USER /sys/kernel/debug" sudo chown -R $USER /sys/kernel/debug fi echo 0 > /sys/kernel/debug/tracing/tracing_on fi } function adb_supports_push_sync { adb --help 2>&1 | grep 'push.*\[--sync\]' 2>&1 >/dev/null } function push { if is_android $OUT; then local maybe_sync='' if adb_supports_push_sync; then maybe_sync='--sync ' fi echo adb push $maybe_sync $1 $DIR adb push $maybe_sync $1 $DIR else echo cp $1 $DIR cp $1 $DIR fi } function pull { if is_android $OUT; then echo adb pull $DIR/$1 $2 adb pull $DIR/$1 $2 else echo mv $DIR/$1 $2 mv $DIR/$1 $2 fi } background=0 while getopts b o; do case "$o" in b) background=1;; *) echo "Invalid option $o"; exit;; esac done # If not set guess the OUT dir using the latest directory. if [ ! -f "$OUT/args.gn" ]; then echo "OUT=$OUT doesn't look like an output directory." echo "Please specify a directory by doing: export OUT=out/xxx" exit 1 fi # You can set the config to one of the files under test/configs e.g. # CONFIG=ftrace.cfg or to :test. Defaults to :test. CONFIG="${CONFIG:-:test}" if is_android $OUT ; then DIR=/data/local/tmp elif is_mac; then DIR=$(mktemp -d $TMPDIR/perfetto.XXXXXX) else DIR=$(mktemp -p $TMPDIR -d perfetto.XXXXXX) fi tools/ninja -C $OUT traced traced_probes perfetto trace_to_text test/configs push $OUT/traced push $OUT/traced_probes push $OUT/perfetto reset_tracing if is_android $OUT; then PREFIX="PERFETTO_CONSUMER_SOCK_NAME=@perfetto_test_consumer PERFETTO_PRODUCER_SOCK_NAME=@perfetto_test_producer" else PREFIX="" fi if ! is_monolithic $OUT; then PREFIX="$PREFIX LD_LIBRARY_PATH=$DIR" push $OUT/libperfetto.so fi CONFIG_DEVICE_PATH="$CONFIG" CMD_OPTS="" if [[ "$CONFIG" == *.protobuf ]]; then CONFIG_DEVICE_PATH="$CONFIG" CONFIG_PATH=$OUT/$CONFIG; if [[ ! -f $CONFIG_PATH ]]; then echo 'Config "'$CONFIG_PATH'" not known.' exit 1 fi push $CONFIG_PATH elif [[ "$CONFIG" != ":test" ]]; then CONFIG_DEVICE_PATH="$(basename $CONFIG)" CONFIG_PATH=test/configs/$CONFIG # Check if this is a valid absolute path if [[ ! -f $CONFIG_PATH ]]; then CONFIG_PATH=$CONFIG if [[ ! -f $CONFIG_PATH ]]; then echo 'Config "'$CONFIG'" not known.' exit 1 fi fi CMD_OPTS="--txt $CMD_OPTS" push $CONFIG_PATH fi POSTFIX="" if [[ background -eq 1 ]]; then PREFIX="$PREFIX nohup" POSTFIX=" &> /dev/null &" fi if tmux has-session -t demo; then tmux kill-session -t demo fi tmux -2 new-session -d -s demo if tmux -V | awk '{split($2, ver, "."); if (ver[1] < 2) exit 1 ; else if (ver[1] == 2 && ver[2] < 1) exit 1 }'; then tmux set-option -g mouse on else tmux set-option -g mode-mouse on tmux set-option -g mouse-resize-pane on tmux set-option -g mouse-select-pane on tmux set-option -g mouse-select-window on fi tmux split-window -v tmux split-window -v tmux select-layout even-vertical tmux select-pane -t 0 tmux send-keys "clear" C-m if is_android $OUT; then tmux send-keys "adb shell" C-m fi tmux select-pane -t 1 tmux send-keys "clear" C-m if is_android $OUT; then tmux send-keys "adb shell" C-m fi tmux select-pane -t 2 tmux send-keys "clear" C-m if is_android $OUT; then tmux send-keys "adb shell" C-m fi sleep 2 tmux select-pane -t 1 tmux send-keys "PS1='[traced_probes]$ '" Enter tmux send-keys "cd $DIR" Enter tmux send-keys "$PREFIX ./traced $POSTFIX" Enter tmux select-pane -t 0 tmux send-keys "PS1='[traced]$ '" Enter tmux send-keys "cd $DIR" Enter tmux send-keys "$PREFIX PERFETTO_METATRACE_FILE=mtrace ./traced_probes $POSTFIX" Enter tmux select-pane -t 2 tmux send-keys "PS1='[consumer]$ '" Enter tmux send-keys "cd $DIR" Enter tmux send-keys "$PREFIX ./perfetto $CMD_OPTS -c $CONFIG_DEVICE_PATH -o trace $POSTFIX" # Select consumer pane. tmux select-pane -t 2 tmux -2 attach-session -t demo if [[ background -eq 1 ]]; then exit 0; fi reset_tracing TRACE=$HOME/Downloads/trace pull trace /tmp/trace.protobuf echo -e "\n\x1b[32mPulling trace into $TRACE.pbtext\x1b[0m" $OUT/trace_to_text text < /tmp/trace.protobuf > $TRACE.pbtext echo -e "\n\x1b[32mPulling trace into $TRACE.json\x1b[0m" $OUT/trace_to_text systrace < /tmp/trace.protobuf > $TRACE.json # Keep this last so it can fail. pull mtrace /tmp/mtrace.json # Add [ to beginning of file and replace trailing , with ] to turn into valid # JSON array. sed -i -e '$ s/.$/]/' /tmp/mtrace.json sed -i -e '1s/^/[/' /tmp/mtrace.json