diff options
Diffstat (limited to 'scripts/decode_stacktrace.sh')
| -rwxr-xr-x | scripts/decode_stacktrace.sh | 27 | 
1 files changed, 19 insertions, 8 deletions
diff --git a/scripts/decode_stacktrace.sh b/scripts/decode_stacktrace.sh index 5fbad61fe490..7075e26ab2c4 100755 --- a/scripts/decode_stacktrace.sh +++ b/scripts/decode_stacktrace.sh @@ -45,8 +45,13 @@ else  	fi  fi -declare -A cache -declare -A modcache +declare aarray_support=true +declare -A cache 2>/dev/null +if [[ $? != 0 ]]; then +	aarray_support=false +else +	declare -A modcache +fi  find_module() {  	if [[ -n $debuginfod ]] ; then @@ -97,7 +102,7 @@ parse_symbol() {  	if [[ $module == "" ]] ; then  		local objfile=$vmlinux -	elif [[ "${modcache[$module]+isset}" == "isset" ]]; then +	elif [[ $aarray_support == true && "${modcache[$module]+isset}" == "isset" ]]; then  		local objfile=${modcache[$module]}  	else  		local objfile=$(find_module) @@ -105,7 +110,9 @@ parse_symbol() {  			echo "WARNING! Modules path isn't set, but is needed to parse this symbol" >&2  			return  		fi -		modcache[$module]=$objfile +		if [[ $aarray_support == true ]]; then +			modcache[$module]=$objfile +		fi  	fi  	# Remove the englobing parenthesis @@ -125,7 +132,7 @@ parse_symbol() {  	# Use 'nm vmlinux' to figure out the base address of said symbol.  	# It's actually faster to call it every time than to load it  	# all into bash. -	if [[ "${cache[$module,$name]+isset}" == "isset" ]]; then +	if [[ $aarray_support == true && "${cache[$module,$name]+isset}" == "isset" ]]; then  		local base_addr=${cache[$module,$name]}  	else  		local base_addr=$(nm "$objfile" 2>/dev/null | awk '$3 == "'$name'" && ($2 == "t" || $2 == "T") {print $1; exit}') @@ -133,7 +140,9 @@ parse_symbol() {  			# address not found  			return  		fi -		cache[$module,$name]="$base_addr" +		if [[ $aarray_support == true ]]; then +			cache[$module,$name]="$base_addr" +		fi  	fi  	# Let's start doing the math to get the exact address into the  	# symbol. First, strip out the symbol total length. @@ -149,11 +158,13 @@ parse_symbol() {  	# Pass it to addr2line to get filename and line number  	# Could get more than one result -	if [[ "${cache[$module,$address]+isset}" == "isset" ]]; then +	if [[ $aarray_support == true && "${cache[$module,$address]+isset}" == "isset" ]]; then  		local code=${cache[$module,$address]}  	else  		local code=$(${CROSS_COMPILE}addr2line -i -e "$objfile" "$address" 2>/dev/null) -		cache[$module,$address]=$code +		if [[ $aarray_support == true ]]; then +			cache[$module,$address]=$code +		fi  	fi  	# addr2line doesn't return a proper error code if it fails, so  | 
