88 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/bash
 | 
						|
 | 
						|
# How we recognize whether a line in the file is from the stack-trace.
 | 
						|
STACK_LINE=".*\(.*\) \[.*\]"
 | 
						|
# How we match the date + time part of a line.
 | 
						|
DATE_TIME="[0-9]\+-[0-9]\+-[0-9]\+ [0-9]\+:[0-9]\+:[0-9]\+"
 | 
						|
 | 
						|
function print_usage {
 | 
						|
    echo "usage: stacktrace [-p prefix] [stacktrace.txt]"
 | 
						|
    echo
 | 
						|
    echo "-p frefix: The path prefix (e.g. /usr/local/mariadb-maxscale/) "
 | 
						|
    echo "           to remove when searching for files."
 | 
						|
    echo
 | 
						|
    echo "stacktrace.txt: A file containing a stack-trace."
 | 
						|
    exit 1
 | 
						|
}
 | 
						|
 | 
						|
function print_usage_and_exit {
 | 
						|
    print_usage
 | 
						|
    exit 1
 | 
						|
}
 | 
						|
 | 
						|
function parse_stack_trace {
 | 
						|
    local prefix=$1
 | 
						|
    local file=$2
 | 
						|
 | 
						|
    cat $file | egrep "$STACK_LINE" | sed "s/$DATE_TIME//" | \
 | 
						|
    while read line
 | 
						|
    do
 | 
						|
	local path=${line%%(*}
 | 
						|
	local entry="("${line##*(}
 | 
						|
 | 
						|
	path=${path#$prefix}
 | 
						|
 | 
						|
	if [ -e "${path}" ]
 | 
						|
	then
 | 
						|
	    file ${path} | fgrep -q executable
 | 
						|
	    let rc=$?
 | 
						|
	    local address;
 | 
						|
	    
 | 
						|
	    if [ $rc -eq 0 ]
 | 
						|
	    then
 | 
						|
		address=${entry#*\[}
 | 
						|
		address=${address%\]*}
 | 
						|
	    else
 | 
						|
		address=${entry#*\+}
 | 
						|
		address=${address%\)*}
 | 
						|
	    fi
 | 
						|
 | 
						|
	    addr2line -e ${path} ${address}
 | 
						|
        else
 | 
						|
	    echo ${line}
 | 
						|
	fi
 | 
						|
    done
 | 
						|
}
 | 
						|
 | 
						|
function main {
 | 
						|
    local prefix
 | 
						|
    local key
 | 
						|
    
 | 
						|
    while [[ $# > 1 ]]
 | 
						|
    do
 | 
						|
	key="$1"
 | 
						|
	
 | 
						|
	case $key in
 | 
						|
	    -h)
 | 
						|
		print_usage
 | 
						|
		exit
 | 
						|
		;;
 | 
						|
	    -p|--prefix)
 | 
						|
		prefix="$2";
 | 
						|
		shift
 | 
						|
		;;
 | 
						|
 | 
						|
	    *)
 | 
						|
		echo "error: Unknown parameter $key"
 | 
						|
		print_usage_and_exit
 | 
						|
	esac
 | 
						|
	shift
 | 
						|
    done
 | 
						|
 | 
						|
    local file=$1
 | 
						|
 | 
						|
    parse_stack_trace "$prefix" "$file"
 | 
						|
}
 | 
						|
 | 
						|
main $*
 |