1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3# perf archive 4# Arnaldo Carvalho de Melo <acme@redhat.com> 5 6PERF_DATA=perf.data 7PERF_SYMBOLS=perf.symbols 8PERF_ALL=perf.all 9ALL=0 10UNPACK=0 11 12while [ $# -gt 0 ] ; do 13 if [ $1 == "--all" ]; then 14 ALL=1 15 shift 16 elif [ $1 == "--unpack" ]; then 17 UNPACK=1 18 shift 19 else 20 PERF_DATA=$1 21 UNPACK_TAR=$1 22 shift 23 fi 24done 25 26if [ $UNPACK -eq 1 ]; then 27 if [ ! -z "$UNPACK_TAR" ]; then # tar given as an argument 28 if [ ! -e "$UNPACK_TAR" ]; then 29 echo "Provided file $UNPACK_TAR does not exist" 30 exit 1 31 fi 32 TARGET="$UNPACK_TAR" 33 else # search for perf tar in the current directory 34 TARGET=`find . -regex "\./perf.*\.tar\.bz2"` 35 TARGET_NUM=`echo -n "$TARGET" | grep -c '^'` 36 37 if [ -z "$TARGET" -o $TARGET_NUM -gt 1 ]; then 38 echo -e "Error: $TARGET_NUM files found for unpacking:\n$TARGET" 39 echo "Provide the requested file as an argument" 40 exit 1 41 else 42 echo "Found target file for unpacking: $TARGET" 43 fi 44 fi 45 46 if [[ "$TARGET" =~ (\./)?$PERF_ALL.*.tar.bz2 ]]; then # perf tar generated by --all option 47 TAR_CONTENTS=`tar tvf "$TARGET" | tr -s " " | cut -d " " -f 6` 48 VALID_TAR=`echo "$TAR_CONTENTS" | grep "$PERF_SYMBOLS.tar.bz2" | wc -l` # check if it contains a sub-tar perf.symbols 49 if [ $VALID_TAR -ne 1 ]; then 50 echo "Error: $TARGET file is not valid (contains zero or multiple sub-tar files with debug symbols)" 51 exit 1 52 fi 53 54 INTERSECT=`comm -12 <(ls) <(echo "$TAR_CONTENTS") | tr "\n" " "` # check for overwriting 55 if [ ! -z "$INTERSECT" ]; then # prompt if file(s) already exist in the current directory 56 echo "File(s) ${INTERSECT::-1} already exist in the current directory." 57 while true; do 58 read -p 'Do you wish to overwrite them? ' yn 59 case $yn in 60 [Yy]* ) break;; 61 [Nn]* ) exit 1;; 62 * ) echo "Please answer yes or no.";; 63 esac 64 done 65 fi 66 67 # unzip the perf.data file in the current working directory and debug symbols in ~/.debug directory 68 tar xvf $TARGET && tar xvf $PERF_SYMBOLS.tar.bz2 -C ~/.debug 69 70 else # perf tar generated by perf archive (contains only debug symbols) 71 tar xvf $TARGET -C ~/.debug 72 fi 73 exit 0 74fi 75 76# 77# PERF_BUILDID_DIR environment variable set by perf 78# path to buildid directory, default to $HOME/.debug 79# 80if [ -z $PERF_BUILDID_DIR ]; then 81 PERF_BUILDID_DIR=~/.debug/ 82else 83 # append / to make substitutions work 84 PERF_BUILDID_DIR=$PERF_BUILDID_DIR/ 85fi 86 87BUILDIDS=$(mktemp /tmp/perf-archive-buildids.XXXXXX) 88 89perf buildid-list -i $PERF_DATA --with-hits | grep -v "^ " > $BUILDIDS 90if [ ! -s $BUILDIDS ] ; then 91 echo "perf archive: no build-ids found" 92 rm $BUILDIDS || true 93 exit 1 94fi 95 96MANIFEST=$(mktemp /tmp/perf-archive-manifest.XXXXXX) 97PERF_BUILDID_LINKDIR=$(readlink -f $PERF_BUILDID_DIR)/ 98 99cut -d ' ' -f 1 $BUILDIDS | \ 100while read build_id ; do 101 linkname=$PERF_BUILDID_DIR.build-id/${build_id:0:2}/${build_id:2} 102 filename=$(readlink -f $linkname) 103 echo ${linkname#$PERF_BUILDID_DIR} >> $MANIFEST 104 echo ${filename#$PERF_BUILDID_LINKDIR} >> $MANIFEST 105done 106 107if [ $ALL -eq 1 ]; then # pack perf.data file together with tar containing debug symbols 108 HOSTNAME=$(hostname) 109 DATE=$(date '+%Y%m%d-%H%M%S') 110 tar cjf $PERF_SYMBOLS.tar.bz2 -C $PERF_BUILDID_DIR -T $MANIFEST 111 tar cjf $PERF_ALL-$HOSTNAME-$DATE.tar.bz2 $PERF_DATA $PERF_SYMBOLS.tar.bz2 112 rm $PERF_SYMBOLS.tar.bz2 $MANIFEST $BUILDIDS || true 113else # pack only the debug symbols 114 tar cjf $PERF_DATA.tar.bz2 -C $PERF_BUILDID_DIR -T $MANIFEST 115 rm $MANIFEST $BUILDIDS || true 116fi 117 118echo -e "Now please run:\n" 119echo -e "$ perf archive --unpack\n" 120echo "or unpack the tar manually wherever you need to run 'perf report' on." 121exit 0 122