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:
parent
7ddab8fa7b
commit
6ffce4d698
94
extras/devel-tools/print-backtrace.sh
Executable file
94
extras/devel-tools/print-backtrace.sh
Executable 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
|
||||
|
Loading…
Reference in New Issue
Block a user