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 $*
 | 
