extras/devel-tools: script to resolve bt addresses

Problem:
STACK_WINDs in a gluster backtrace dumped in a log file are
undecipherable with only the hex addresses of the location
leaving us without a clue.

Solution:
This utility uses the undeciphered lines in the backtrace and the
associated debuginfo rpm to generate the function name and the file and
line number associated with the stack frame.

Passing "none" as the debuginfo rpm name will make the script assume
that you want to resolve against a source install and not a debuginfo
rpm.

You would need to copy the unresolved lines from the backtrace into a
file and pass the name of this file to the utility as the input file.

Change-Id: I4d8bc1ae205af37688d03298de49654018bdba9d
BUG: 1426891
Signed-off-by: Milind Changire <mchangir@redhat.com>
Reviewed-on: https://review.gluster.org/16763
Smoke: Gluster Build System <jenkins@build.gluster.org>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
This commit is contained in:
Milind Changire 2017-02-28 10:38:19 +05:30 committed by Vijay Bellur
parent 7ddab8fa7b
commit 6ffce4d698

View File

@ -0,0 +1,94 @@
#!/bin/bash
# sample unresolved backtrace lines picked up from a brick log that should go
# into a backtrace file eg. bt-file.txt:
# /usr/lib64/glusterfs/3.8.4/xlator/cluster/replicate.so(+0x3ec81)[0x7fe4bc271c81]
# /usr/lib64/glusterfs/3.8.4/xlator/cluster/replicate.so(+0x3eecd)[0x7fe4bc271ecd]
# /usr/lib64/glusterfs/3.8.4/xlator/cluster/replicate.so(+0x404cb)[0x7fe4bc2734cb]
# /usr/lib64/glusterfs/3.8.4/xlator/cluster/replicate.so(+0x3d2b6)[0x7fe4bc2702b6]
# /usr/lib64/glusterfs/3.8.4/xlator/cluster/replicate.so(+0x3d323)[0x7fe4bc270323]
#
# following is the output of the script for the above backtrace lines:
# /usr/lib64/glusterfs/3.8.4/xlator/cluster/replicate.so(+0x3ec81)[0x7fe4bc271c81] __afr_selfheal_data_finalize_source inlined at /usr/src/debug/glusterfs-3.8.4/xlators/cluster/afr/src/afr-self-heal-data.c:684 in __afr_selfheal_data_prepare /usr/src/debug/glusterfs-3.8.4/xlators/cluster/afr/src/afr-self-heal-data.c:603
# /usr/lib64/glusterfs/3.8.4/xlator/cluster/replicate.so(+0x3eecd)[0x7fe4bc271ecd] __afr_selfheal_data /usr/src/debug/glusterfs-3.8.4/xlators/cluster/afr/src/afr-self-heal-data.c:740
# /usr/lib64/glusterfs/3.8.4/xlator/cluster/replicate.so(+0x404cb)[0x7fe4bc2734cb] afr_selfheal_data /usr/src/debug/glusterfs-3.8.4/xlators/cluster/afr/src/afr-self-heal-data.c:883
# /usr/lib64/glusterfs/3.8.4/xlator/cluster/replicate.so(+0x3d2b6)[0x7fe4bc2702b6] afr_selfheal_do /usr/src/debug/glusterfs-3.8.4/xlators/cluster/afr/src/afr-self-heal-common.c:1968
# /usr/lib64/glusterfs/3.8.4/xlator/cluster/replicate.so(+0x3d323)[0x7fe4bc270323] afr_selfheal /usr/src/debug/glusterfs-3.8.4/xlators/cluster/afr/src/afr-self-heal-common.c:2015
#
# Usage with debuginfo RPM:
# print-backtrace.sh $HOME/Downloads/glusterfs-debuginfo-3.8.4-10.el7.x86_64.rpm bt-file.txt
#
# Usage with source install:
# print-packtrace.sh none bt-file.txt
function Usage()
{
echo -e "Usage:\n\t$0 { none | <debuginfo-rpm> } <backtrace-file>"
echo "none: implies we don't have a debuginfo rpm but want to resolve"
echo " against a source install which already has the debuginfo"
echo " NOTE: in this case you should have configured the build"
echo " with --enable-debug and the linker options should"
echo " have the option -rdynamic"
}
debuginfo_rpm=$1
backtrace_file=$2
if [ ! $debuginfo_rpm ] || [ ! $backtrace_file ]; then
Usage
exit 1
fi
if [ $debuginfo_rpm != "none" ] && [ ! -f $debuginfo_rpm ]; then
echo "no such rpm file: $debuginfo_rpm"
exit 1
fi
if [ ! -f $backtrace_file ]; then
echo "no such backtrace file: $backtrace_file"
exit 1
fi
if ! file $debuginfo_rpm | grep RPM >/dev/null 2>&1 ; then
echo "file does not look like an rpm: $debuginfo_rpm"
exit 1
fi
rpm_name=""
debuginfo_path=""
debuginfo_extension=""
if [ $debuginfo_rpm != "none" ]; then
# extract the gluster debuginfo rpm to resolve the symbols against
rpm_name=$(basename $debuginfo_rpm '.rpm')
if [ -d $rpm_name ]; then
echo "directory already exists: $rpm_name"
echo "please remove/move it and reattempt"
exit 1
fi
mkdir -p $rpm_name
rpm2cpio $debuginfo_rpm | cpio --quiet --extract --make-directories --preserve-modification-time --directory=$rpm_name
debuginfo_path="$PWD/$rpm_name/usr/lib/debug"
debuginfo_extension=".debug"
else
debuginfo_path=""
debuginfo_extension=""
fi
# NOTE: backtrace file should contain only the lines which need to be resolved
for bt in $(grep glusterfs $backtrace_file)
do
libname=$(echo $bt | cut -f 1 -d '(')
addr=$(echo $bt | cut -f 2 -d '(' | cut -f 1 -d ')')
# only unresolved addresses start with a '+'
if echo $addr | egrep '^\+' >/dev/null 2>&1 ; then
newbt=( $(eu-addr2line --functions --exe=${debuginfo_path}${libname}${debuginfo_extension} $addr) )
echo "$bt ${newbt[*]}"
fi
done
# remove the temporary directory
if [ -d $rpm_name ]; then
rm -rf $rpm_name
fi