libfuse/util/parse-backtrace.sh
Bernd Schubert beff8a8ebe Fix program-path in util/parse-backtrace and dump_stack function
The option to the path of the binary had been accidentally removed
in the scripts that can parse backtraces.
The dump_stack() function had left over debug messages.
2024-08-02 20:08:38 +02:00

118 lines
2.7 KiB
Bash
Executable File

#!/bin/bash
tmpfile=`mktemp backtrace.XXX`
PROGRAM_PATH=''
TRACE_TYPE=glibc
print_help()
{
echo "Usage: "
echo " " `basename $0`" [-s] [-p <path/to/filename>] -t <\"full trace\">"
echo "Options: "
echo " -t '<trace>' - The entire trace should be put into quotes"
echo " for this option"
echo " -p path/to/filename - optional path to the binary, typically"
echo " autodetected"
echo
exit 1
}
if [ -z "$1" -o "$1" = "-h" -o "$1" = "--help" ]; then
rm -f $tmpfile
print_help
fi
while getopts "hf:t:p:" opt; do
case $opt in
h)
print_help
;;
f)
PROGRAM_PATH="$OPTARG"
;;
t)
TRACE="$OPTARG"
;;
p)
PROGRAM_PATH="$OPTARG"
;;
*)
print_help
;;
esac
done
# use addr2line
parse_glibc_trace()
{
local trace="$1"
local filename="$2"
local tmpname=""
local symbol=""
IFS=$'\n'
for line in ${trace}; do
#echo "Line: '$line"
# remove C2 A0 (non breaking space, as inserted by windows)
line=$(echo $line | sed 's/\xC2\xA0/ /g')
line=`echo $line | egrep "\[" | egrep "\]"`
[ -n "$line" ] || continue
# cut off additional syslog part - beginning of line to ':'
line=$(echo $line line | sed -e 's/.*://')
# parse lines like
# /usr/lib/libfuse3.so.3(+0x1c0ef) [0x7fca6061c0ef]
filename=$(echo $line | awk '{print $1}' | sed -e 's/(.*$//')
if [ -z "${filename}" ]; then
echo "Failed to get filename path for line: \"$line\""
return
fi
if [[ $filename != /* ]]; then
if [ -n "${PROGRAM_PATH}" ]; then
filename="${PROGRAM_PATH}"
else
tmpname="$(which $filename)"
if [ $? -ne 0 ]; then
echo "Failed to get path for '$filename'"
continue
fi
filename="${tmpname}"
fi
fi
# for plain glibc backtrace_symbols the symbol is also in column1,
# within the brackets ()
symbol=$(echo $line | awk '{print $1}' | sed -e 's/^.*(//' | sed -e 's/).*//')
if [ -z "${symbol}" ]; then
echo "Failed to get symbol for line: \"$line\""
continue
fi
addr2line -a -p -s -C -f -i -e ${filename} ${symbol}
done
}
if [ -z "$TRACE" ]; then
echo "Missing backtrace option!"
echo
print_help
fi
# For now only glibc backtrace_symbols traces are supported
if [ $TRACE_TYPE = "glibc" ]; then
parse_glibc_trace "$TRACE" "${PROGRAM_PATH}"
else
echo "Unknown tracetype: '${TRACE_TYPE}'"
fi
rm -f $tmpfile