scripts/decode_stacktrace.sh: guess path to vmlinux by release name

Add option decode_stacktrace -r <release> to specify only release name.
This is enough to guess standard paths to vmlinux and modules:

$ echo -e 'schedule+0x0/0x0
tap_open+0x0/0x0 [tap]' |
	./scripts/decode_stacktrace.sh -r 5.4.0-37-generic
schedule (kernel/sched/core.c:4138)
tap_open (drivers/net/tap.c:502) tap

Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Cc: Sasha Levin <sashal@kernel.org>
Link: http://lkml.kernel.org/r/159282923334.248444.2399153100007347838.stgit@buzz
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Konstantin Khlebnikov 2020-08-06 23:17:43 -07:00 committed by Linus Torvalds
parent 431151b64a
commit f90dde44c5

View File

@ -5,14 +5,33 @@
if [[ $# < 1 ]]; then if [[ $# < 1 ]]; then
echo "Usage:" echo "Usage:"
echo " $0 <vmlinux> [base path] [modules path]" echo " $0 -r <release> | <vmlinux> [base path] [modules path]"
exit 1 exit 1
fi fi
vmlinux=$1 if [[ $1 == "-r" ]] ; then
basepath=${2-auto} vmlinux=""
modpath=$3 basepath="auto"
release="" modpath=""
release=$2
for fn in {,/usr/lib/debug}/boot/vmlinux-$release{,.debug} /lib/modules/$release{,/build}/vmlinux ; do
if [ -e "$fn" ] ; then
vmlinux=$fn
break
fi
done
if [[ $vmlinux == "" ]] ; then
echo "ERROR! vmlinux image for release $release is not found" >&2
exit 2
fi
else
vmlinux=$1
basepath=${2-auto}
modpath=$3
release=""
fi
declare -A cache declare -A cache
declare -A modcache declare -A modcache