Update bt-akaros.sh
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 22 Feb 2017 19:13:55 +0000 (14:13 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 2 Mar 2017 18:01:28 +0000 (13:01 -0500)
Two changes:
- It uses nm with demangling, so we get better backtraces from C++ programs
- It caches symbol tables for binaries, such that we run nm only once per
  object.  Between that and grep, it speeds up the backtrace for large
binaries.

You'll need Bash version 4 or later, though you probably have it already.
If not, use the old script on your own.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
scripts/bt-akaros.sh

index 3f04f07..ec390ed 100755 (executable)
@@ -4,32 +4,17 @@
 # Resolves functions from an Akaros user backtrace.
 # Pipe a backtrace (echo "huge-copy-paste" | ./thisfile.sh) to it.
 # Be sure to set your environment paths for the SOLIBS and BIN
-#
-# You can also source this (hit ctrl-D, to abort the while read line loop) and
-# then call print_glb_func directly.
 
 : ${SOLIBS_PREFIX:=~/akaros/ros-kernel/kern/kfs/lib/}
 : ${SO_REGEX:=.*so$}
 : ${BIN_PREFIX:=~/akaros/ros-kernel/kern/kfs/bin/}
 
-# takes the path to the binary and offset (offset in hex), prints the 'greatest
-# lower bound' of the functions, which is probably the function where the
-# offset is within the binary.  be careful with hex (target should be in hex,
-# with a leading "0x").
-function print_glb_func()
+# takes the path to the binary and offset (offset in hex), prints name of the
+# function where the offset is in the binary.  basically a wrapper for
+# addr2line.
+function print_func()
 {
-       # remove the 2>/dev/null for debugging.  it helps at runtime in case it
-       # can't find a file (e.g. solibs in multiple places)
-       readelf -s $1 2>/dev/null | awk -v target=$2 '
-       BEGIN { glb = 0; name = "LOOKUP_FAILED"}
-       {
-               addr = strtonum("0x"$2)
-               tgt = strtonum(target)
-               if (($4 == "FUNC") && (addr > glb) && (addr <= tgt)) {
-                       glb = addr; name = $8
-               }
-       }
-       END { printf("%s+0x%x\n", name, tgt - glb) }'
+       addr2line -e $1 -fC $2 | xargs
 }
 
 while read line
@@ -44,9 +29,9 @@ do
        echo -n $line " "
        if [[ $binary =~ $SO_REGEX ]]
        then
-               # could also do addr=$(print_glb_func $lib $off)
-               print_glb_func $SOLIBS_PREFIX/$binary $lib_off
+               # could also do addr=$(print_func $lib $off)
+               print_func $SOLIBS_PREFIX/$binary $lib_off
        else
-               print_glb_func $BIN_PREFIX/$binary $app_off
+               print_func $BIN_PREFIX/$binary $app_off
        fi
 done