You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.4 KiB
85 lines
2.4 KiB
#! /bin/bash -u |
|
# Copyright 2015 The Chromium OS Authors. All rights reserved. |
|
# Use of this source code is governed by a BSD-style license that can be |
|
# found in the LICENSE file. |
|
|
|
# This script first collects the addresses of the instructions being tracked by |
|
# the profile. After that, it calculates the offset of the addresses compared |
|
# to the base address and then gets the number of execution times for each |
|
# address. After that, it draws the heat map and the time map. A heap map shows |
|
# the overall hotness of instructions being executed while the time map shows the |
|
# hotness of instruction at different time. |
|
|
|
# binary : the name of the binary |
|
# profile : output of 'perf report -D' |
|
# loading_address : the loading address of the binary |
|
# page_size : the size to be displayed, usually 4096(byte). |
|
|
|
if [[ $# -ne 4 ]]; then |
|
echo 'Illegal number of parameters' exit 1 |
|
fi |
|
|
|
binary=$1 |
|
profile=$2 |
|
loading_address=$3 |
|
page_size=$4 |
|
|
|
# size of binary supported. |
|
binary_maximum=1000000000 |
|
|
|
if ! [[ -e $profile ]] ; then |
|
echo "error: profile does not exist" >&2; exit 1 |
|
fi |
|
|
|
re='^[0-9]+$' |
|
if ! [[ $page_size =~ $re ]] ; then |
|
echo "error: page_size is not a number" >&2; exit 1 |
|
fi |
|
|
|
function test { |
|
"$@" |
|
local status=$? |
|
if [ $status -ne 0 ]; then |
|
echo "error with $1" >&2 |
|
fi |
|
return $status |
|
} |
|
|
|
HEAT_PNG="heat_map.png" |
|
TIMELINE_PNG="timeline.png" |
|
|
|
test grep -A 2 PERF_RECORD_SAMPLE $profile | grep -A 1 -B 1 "thread: $binary" | \ |
|
grep -B 2 "dso.*$binary$" | awk -v base=$loading_address \ |
|
"BEGIN { count=0; } /PERF_RECORD_SAMPLE/ {addr = strtonum(\$8) - strtonum(base); \ |
|
if (addr < $binary_maximum) count++; \ |
|
if (addr < $binary_maximum) print \$7,count,int(addr/$page_size)*$page_size}" > out.txt |
|
|
|
|
|
test awk '{print $3}' out.txt | sort -n | uniq -c > inst-histo.txt |
|
|
|
# generate inst heat map |
|
echo " |
|
set terminal png size 600,450 |
|
set xlabel \"Instruction Virtual Address (MB)\" |
|
set ylabel \"Sample Occurance\" |
|
set grid |
|
|
|
set output \"${HEAT_PNG}\" |
|
set title \"Instruction Heat Map\" |
|
|
|
plot 'inst-histo.txt' using (\$2/1024/1024):1 with impulses notitle |
|
" | test gnuplot |
|
|
|
# generate instruction page access timeline |
|
num=$(awk 'END {print NR+1}' out.txt) |
|
|
|
echo " |
|
set terminal png size 600,450 |
|
set xlabel \"time (sec)\" |
|
set ylabel \"Instruction Virtual Address (MB)\" |
|
|
|
set output \"${TIMELINE_PNG}\" |
|
set title \"instruction page accessd timeline\" |
|
|
|
plot 'out.txt' using (\$0/$num*10):(\$3/1024/1024) with dots notitle |
|
" | test gnuplot
|
|
|