Commit | Line | Data |
---|---|---|
2c585174 | 1 | #!/bin/bash |
b2441318 | 2 | # SPDX-License-Identifier: GPL-2.0 |
2c585174 ACM |
3 | # perf archive |
4 | # Arnaldo Carvalho de Melo <acme@redhat.com> | |
5 | ||
6 | PERF_DATA=perf.data | |
624dda10 VM |
7 | PERF_SYMBOLS=perf.symbols |
8 | PERF_ALL=perf.all | |
9 | ALL=0 | |
e43c64c9 | 10 | UNPACK=0 |
624dda10 VM |
11 | |
12 | while [ $# -gt 0 ] ; do | |
13 | if [ $1 == "--all" ]; then | |
14 | ALL=1 | |
15 | shift | |
e43c64c9 VM |
16 | elif [ $1 == "--unpack" ]; then |
17 | UNPACK=1 | |
18 | shift | |
624dda10 VM |
19 | else |
20 | PERF_DATA=$1 | |
e43c64c9 | 21 | UNPACK_TAR=$1 |
624dda10 VM |
22 | shift |
23 | fi | |
24 | done | |
2c585174 | 25 | |
e43c64c9 VM |
26 | if [ $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 | |
74 | fi | |
75 | ||
45de34bb SE |
76 | # |
77 | # PERF_BUILDID_DIR environment variable set by perf | |
78 | # path to buildid directory, default to $HOME/.debug | |
79 | # | |
80 | if [ -z $PERF_BUILDID_DIR ]; then | |
81 | PERF_BUILDID_DIR=~/.debug/ | |
82 | else | |
83 | # append / to make substitutions work | |
84 | PERF_BUILDID_DIR=$PERF_BUILDID_DIR/ | |
85 | fi | |
86 | ||
2c585174 ACM |
87 | BUILDIDS=$(mktemp /tmp/perf-archive-buildids.XXXXXX) |
88 | ||
ec4d0a76 | 89 | perf buildid-list -i $PERF_DATA --with-hits | grep -v "^ " > $BUILDIDS |
2c585174 ACM |
90 | if [ ! -s $BUILDIDS ] ; then |
91 | echo "perf archive: no build-ids found" | |
73eb422c | 92 | rm $BUILDIDS || true |
2c585174 ACM |
93 | exit 1 |
94 | fi | |
95 | ||
96 | MANIFEST=$(mktemp /tmp/perf-archive-manifest.XXXXXX) | |
e3b61933 | 97 | PERF_BUILDID_LINKDIR=$(readlink -f $PERF_BUILDID_DIR)/ |
2c585174 ACM |
98 | |
99 | cut -d ' ' -f 1 $BUILDIDS | \ | |
100 | while read build_id ; do | |
45de34bb | 101 | linkname=$PERF_BUILDID_DIR.build-id/${build_id:0:2}/${build_id:2} |
2c585174 | 102 | filename=$(readlink -f $linkname) |
45de34bb | 103 | echo ${linkname#$PERF_BUILDID_DIR} >> $MANIFEST |
e3b61933 | 104 | echo ${filename#$PERF_BUILDID_LINKDIR} >> $MANIFEST |
2c585174 ACM |
105 | done |
106 | ||
624dda10 VM |
107 | if [ $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 | |
624dda10 VM |
113 | else # pack only the debug symbols |
114 | tar cjf $PERF_DATA.tar.bz2 -C $PERF_BUILDID_DIR -T $MANIFEST | |
115 | rm $MANIFEST $BUILDIDS || true | |
624dda10 VM |
116 | fi |
117 | ||
e43c64c9 VM |
118 | echo -e "Now please run:\n" |
119 | echo -e "$ perf archive --unpack\n" | |
120 | echo "or unpack the tar manually wherever you need to run 'perf report' on." | |
2c585174 | 121 | exit 0 |