scripts/decode_stacktrace.sh: support old bash version
[ Upstream commit 3af8acf6aff2a98731522b52927429760f0b8006 ] Old bash version don't support associative array variables. Avoid to use associative array variables to avoid error. Without this, old bash version will report error as fellowing [ 15.954042] Kernel panic - not syncing: sysrq triggered crash [ 15.955252] CPU: 1 PID: 167 Comm: sh Not tainted 5.18.0-rc1-00208-gb7d075db2fd5 #4 [ 15.956472] Hardware name: Hobot J5 Virtual development board (DT) [ 15.957856] Call trace: ./scripts/decode_stacktrace.sh: line 128: ,dump_backtrace: syntax error: operand expected (error token is ",dump_backtrace") Link: https://lkml.kernel.org/r/20220409180331.24047-1-schspa@gmail.com Signed-off-by: Schspa Shi <schspa@gmail.com> Cc: Stephen Boyd <swboyd@chromium.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Stable-dep-of: efbd63983533 ("scripts/decode_stacktrace.sh: optionally use LLVM utilities") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
ae992f14b1
commit
a3d71b6ae9
@@ -33,8 +33,13 @@ else
|
|||||||
release=""
|
release=""
|
||||||
fi
|
fi
|
||||||
|
|
||||||
declare -A cache
|
declare aarray_support=true
|
||||||
declare -A modcache
|
declare -A cache 2>/dev/null
|
||||||
|
if [[ $? != 0 ]]; then
|
||||||
|
aarray_support=false
|
||||||
|
else
|
||||||
|
declare -A modcache
|
||||||
|
fi
|
||||||
|
|
||||||
find_module() {
|
find_module() {
|
||||||
if [[ "$modpath" != "" ]] ; then
|
if [[ "$modpath" != "" ]] ; then
|
||||||
@@ -74,7 +79,7 @@ parse_symbol() {
|
|||||||
|
|
||||||
if [[ $module == "" ]] ; then
|
if [[ $module == "" ]] ; then
|
||||||
local objfile=$vmlinux
|
local objfile=$vmlinux
|
||||||
elif [[ "${modcache[$module]+isset}" == "isset" ]]; then
|
elif [[ $aarray_support == true && "${modcache[$module]+isset}" == "isset" ]]; then
|
||||||
local objfile=${modcache[$module]}
|
local objfile=${modcache[$module]}
|
||||||
else
|
else
|
||||||
local objfile=$(find_module)
|
local objfile=$(find_module)
|
||||||
@@ -82,7 +87,9 @@ parse_symbol() {
|
|||||||
echo "WARNING! Modules path isn't set, but is needed to parse this symbol" >&2
|
echo "WARNING! Modules path isn't set, but is needed to parse this symbol" >&2
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
modcache[$module]=$objfile
|
if [[ $aarray_support == true ]]; then
|
||||||
|
modcache[$module]=$objfile
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Remove the englobing parenthesis
|
# Remove the englobing parenthesis
|
||||||
@@ -102,7 +109,7 @@ parse_symbol() {
|
|||||||
# Use 'nm vmlinux' to figure out the base address of said 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
|
# It's actually faster to call it every time than to load it
|
||||||
# all into bash.
|
# 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]}
|
local base_addr=${cache[$module,$name]}
|
||||||
else
|
else
|
||||||
local base_addr=$(nm "$objfile" 2>/dev/null | awk '$3 == "'$name'" && ($2 == "t" || $2 == "T") {print $1; exit}')
|
local base_addr=$(nm "$objfile" 2>/dev/null | awk '$3 == "'$name'" && ($2 == "t" || $2 == "T") {print $1; exit}')
|
||||||
@@ -110,7 +117,9 @@ parse_symbol() {
|
|||||||
# address not found
|
# address not found
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
cache[$module,$name]="$base_addr"
|
if [[ $aarray_support == true ]]; then
|
||||||
|
cache[$module,$name]="$base_addr"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
# Let's start doing the math to get the exact address into the
|
# Let's start doing the math to get the exact address into the
|
||||||
# symbol. First, strip out the symbol total length.
|
# symbol. First, strip out the symbol total length.
|
||||||
@@ -126,11 +135,13 @@ parse_symbol() {
|
|||||||
|
|
||||||
# Pass it to addr2line to get filename and line number
|
# Pass it to addr2line to get filename and line number
|
||||||
# Could get more than one result
|
# 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]}
|
local code=${cache[$module,$address]}
|
||||||
else
|
else
|
||||||
local code=$(${CROSS_COMPILE}addr2line -i -e "$objfile" "$address" 2>/dev/null)
|
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
|
fi
|
||||||
|
|
||||||
# addr2line doesn't return a proper error code if it fails, so
|
# addr2line doesn't return a proper error code if it fails, so
|
||||||
|
Reference in New Issue
Block a user