scripts: handle kernel backtraces with bt-akaros.sh Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
diff --git a/scripts/bt-akaros.sh b/scripts/bt-akaros.sh index 97ce8c9..d1b13b0 100755 --- a/scripts/bt-akaros.sh +++ b/scripts/bt-akaros.sh
@@ -1,39 +1,58 @@ #!/bin/bash # Barret Rhoden (brho@cs.berkeley.edu) # -# Resolves functions from an Akaros user backtrace. +# Resolves functions from Akaros backtraces, both user and kernel. # Pipe a backtrace (echo "huge-copy-paste" | ./thisfile.sh) to it. # -# Be sure to set your environment paths for the SOLIBS and BIN, or use the -# defaults, which require AKAROS_ROOT. +# There are a few environment variables you may want to override, which control +# the location of the binaries and libraries. If you use AKAROS_ROOT, KFS, and +# x86, just stick with the defaults. : ${SOLIBS_PREFIX:=$AKAROS_ROOT/kern/kfs/lib/} : ${SO_REGEX:=.*so$} : ${BIN_PREFIX:=$AKAROS_ROOT/kern/kfs/bin/} +: ${KERNEL_BINARY:=$AKAROS_ROOT/obj/kern/akaros-kernel-64b} # 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() -{ +print_user_func() { addr2line -e $1 -fC $2 | xargs } -while read line -do +kernel_line() { + line=$1 + + addr=`echo $line | cut -c 7-25` + + echo -n $line " " + # sed cleans out build paths. All kernel files have 'kern', unlike + # arbitrary user binaries. + addr2line -e $KERNEL_BINARY $addr | sed 's/^.*kern\//at kern\//' +} + +user_line() { + line=$1 + binary=`echo $line | cut -f 6 -d ' '` lib_off=`echo $line | cut -f 9 -d ' '` app_off=`echo $line | cut -f 3 -d ' '` - if [[ $binary == "" ]] - then - break - fi + echo -n $line " " - if [[ $binary =~ $SO_REGEX ]] - then - # could also do addr=$(print_func $lib $off) - print_func $SOLIBS_PREFIX/$binary $lib_off + if [[ $binary =~ $SO_REGEX ]]; then + # could also do addr=$(print_user_func $lib $off) + print_user_func $SOLIBS_PREFIX/$binary $lib_off else - print_func $BIN_PREFIX/$binary $app_off + print_user_func $BIN_PREFIX/$binary $app_off + fi +} + +while read line; do + fifth_char=`echo $line | cut -c 5` + + if [[ $fifth_char == "[" ]]; then + kernel_line "$line" + elif [[ $fifth_char == "A" ]]; then + user_line "$line" fi done