diff options
Diffstat (limited to 'scripts/decode_stacktrace.sh')
| -rwxr-xr-x | scripts/decode_stacktrace.sh | 35 | 
1 files changed, 15 insertions, 20 deletions
diff --git a/scripts/decode_stacktrace.sh b/scripts/decode_stacktrace.sh index 17abc4e7a985..c73cb802a0a3 100755 --- a/scripts/decode_stacktrace.sh +++ b/scripts/decode_stacktrace.sh @@ -242,8 +242,10 @@ debuginfod_get_vmlinux() {  decode_code() {  	local scripts=`dirname "${BASH_SOURCE[0]}"` +	local lim="Code: " -	echo "$1" | $scripts/decodecode +	echo -n "${1%%${lim}*}" +	echo "${lim}${1##*${lim}}" | $scripts/decodecode  }  handle_line() { @@ -255,10 +257,11 @@ handle_line() {  		basepath=${basepath%/init/main.c:*)}  	fi -	local words +	local words spaces -	# Tokenize -	read -a words <<<"$1" +	# Tokenize: words and spaces to preserve the alignment +	read -ra words <<<"$1" +	IFS='#' read -ra spaces <<<"$(shopt -s extglob; echo "${1//+([^[:space:]])/#}")"  	# Remove hex numbers. Do it ourselves until it happens in the  	# kernel @@ -270,19 +273,13 @@ handle_line() {  	for i in "${!words[@]}"; do  		# Remove the address  		if [[ ${words[$i]} =~ \[\<([^]]+)\>\] ]]; then -			unset words[$i] -		fi - -		# Format timestamps with tabs -		if [[ ${words[$i]} == \[ && ${words[$i+1]} == *\] ]]; then -			unset words[$i] -			words[$i+1]=$(printf "[%13s\n" "${words[$i+1]}") +			unset words[$i] spaces[$i]  		fi  	done  	if [[ ${words[$last]} =~ ^[0-9a-f]+\] ]]; then  		words[$last-1]="${words[$last-1]} ${words[$last]}" -		unset words[$last] +		unset words[$last] spaces[$last]  		last=$(( $last - 1 ))  	fi @@ -294,7 +291,7 @@ handle_line() {  	local info_str=""  	if [[ ${words[$last]} =~ \([A-Z]*\) ]]; then  		info_str=${words[$last]} -		unset words[$last] +		unset words[$last] spaces[$last]  		last=$(( $last - 1 ))  	fi @@ -311,7 +308,7 @@ handle_line() {  			modbuildid=  		fi  		symbol=${words[$last-1]} -		unset words[$last-1] +		unset words[$last-1] spaces[$last-1]  	else  		# The symbol is the last element, process it  		symbol=${words[$last]} @@ -323,12 +320,10 @@ handle_line() {  	parse_symbol # modifies $symbol  	# Add up the line number to the symbol -	if [[ -z ${module} ]] -	then -		echo "${words[@]}" "$symbol ${info_str}" -	else -		echo "${words[@]}" "$symbol $module ${info_str}" -	fi +	for i in "${!words[@]}"; do +		echo -n "${spaces[i]}${words[i]}" +	done +	echo "${spaces[$last]}${symbol}${module:+ ${module}}${info_str:+ ${info_str}}"  }  while read line; do  | 
