Add space between text and url in ak-code-review
[akaros.git] / scripts / bt-akaros.sh
1 #!/bin/bash
2 # Barret Rhoden (brho@cs.berkeley.edu)
3 #
4 # Resolves functions from an Akaros user backtrace.
5 # Pipe a backtrace (echo "huge-copy-paste" | ./thisfile.sh) to it.
6 # Be sure to set your environment paths for the SOLIBS and BIN
7 #
8 # You can also source this (hit ctrl-D, to abort the while read line loop) and
9 # then call print_glb_func directly.
10
11 : ${SOLIBS_PREFIX:=~/akaros/ros-kernel/kern/kfs/lib/}
12 : ${SO_REGEX:=.*so$}
13 : ${BIN_PREFIX:=~/akaros/ros-kernel/kern/kfs/bin/}
14
15 # takes the path to the binary and offset (offset in hex), prints the 'greatest
16 # lower bound' of the functions, which is probably the function where the
17 # offset is within the binary.  be careful with hex (target should be in hex,
18 # with a leading "0x").
19 function print_glb_func()
20 {
21         # remove the 2>/dev/null for debugging.  it helps at runtime in case it
22         # can't find a file (e.g. solibs in multiple places)
23         readelf -s $1 2>/dev/null | awk -v target=$2 '
24         BEGIN { glb = 0; name = "LOOKUP_FAILED"}
25         {
26                 addr = strtonum("0x"$2)
27                 tgt = strtonum(target)
28                 if (($4 == "FUNC") && (addr > glb) && (addr <= tgt)) {
29                         glb = addr; name = $8
30                 }
31         }
32         END { printf("%s+0x%x\n", name, tgt - glb) }'
33 }
34
35 while read line
36 do
37         binary=`echo $line | cut -f 6 -d ' '`
38         lib_off=`echo $line | cut -f 9 -d ' '`
39         app_off=`echo $line | cut -f 3 -d ' '`
40         if [[ $binary == "" ]]
41         then
42                 break
43         fi
44         echo -n $line " "
45         if [[ $binary =~ $SO_REGEX ]]
46         then
47                 # could also do addr=$(print_glb_func $lib $off)
48                 print_glb_func $SOLIBS_PREFIX/$binary $lib_off
49         else
50                 print_glb_func $BIN_PREFIX/$binary $app_off
51         fi
52 done