blob: dd2b15c8c521b7422ddf84443352d41e38265d73 [file] [log] [blame]
#!/bin/bash
# @@@ START COPYRIGHT @@@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
# @@@ END COPYRIGHT @@@
# This script takes a core filename and sets up the environment for it.
# It then starts GDB for it.
dis_usage()
{
echo "Usage $0 -n <corefile>"
echo " -n does not start gdb but instead displays the command to set environment."
echo ""
echo "This script will examine the core file and set up the PATH and LD_LIBRARY_PATH"
echo "variables to match what was used when the core was created. GDB will then be"
echo "started for it. If you want to save the needed commands, use -n and > to"
echo "redirect output to a file."
exit 0
}
doGDB=1 # set to 1, means start gdb, 0 means to not start it.
while getopts 'hn' parmOpt
do
case $parmOpt in
h) dis_usage
exit 0
;;
n) doGDB=0
;;
?) echo "Invalid option specified. Only -h and -n are allowed."
exit 0
;;
esac
done
shift $((${OPTIND} - 1))
if [ $# -lt 1 ] ; then
dis_usage
exit 0
fi
CORENAME_FULL=$1
if [ ! -e ${CORENAME_FULL} ] ; then
echo "Specified core file does not exist."
exit 0
fi
if [ $(file ${CORENAME_FULL} | grep -c "core file") -eq 0 ] ; then
echo "Specified core file does not seem to be a valid core file."
echo ">file ${CORENAME_FULL}"
file ${CORENAME_FULL}
exit 0
fi
echo "#Processing ${CORENAME_FULL}"
# get the execution that caused this core. gdb tells us that.
PROGRAM_NAME=$(gdb -nx -batch -c ${CORENAME_FULL} -ex quit | grep '^Core was')
echo ""
echo "#${PROGRAM_NAME}"
PROGRAM_NAME=$(echo ${PROGRAM_NAME} | awk '/^Core was/ {command=substr($5,2); cmdlen=index($5,"."); if (cmdlen==0) cmdlen=length($5)+2; print substr($5,2,cmdlen-3)}')
echo ""
echo "#Scanning for path and ld_library_path names. Be patient."
PROGDIRS=$(awk 'BEGIN {ldPathFound=0;pathFound=0}
/\x00LD_LIBRARY_PATH=/,/\x00/ {if (ldPathFound==1) {next}
else {ldPathFound=1;startStr=match($0,"\x00LD_LIBRARY_PATH=");stopStr=match(substr($0,startStr+1),"\x00"); print substr($0, startStr+1, stopStr-1)}}
/\x00PATH=/,/\x00/ {if (pathFound==1) {next}
else {pathFound=1; startStr=match($0,"\x00PATH=");stopStr=match(substr($0,startStr+1),"\x00"); print substr($0, startStr+1, stopStr-1)}}
{ if ( ldPathFound + pathFound == 2 ) exit }' ${CORENAME_FULL})
#
#grep -o -a -P '\000(LD_LIBRARY_)?PATH=[^\000]*' ${CORENAME_FULL} | \
# awk -F= 'BEGIN {ldPathFound=0;pathFound=0}
# /^\x00LD_LIBRARY_PATH/ {if (ldPathFound==1) {next} else {ldPathFound=1;print substr($0,2)}}
# /^\x00PATH/ {if (pathFound==1) {next} else {pathFound=1; print substr($0,2)}}')
if [ ${#PROGDIRS} -gt 0 ] ; then
wantDir=$(echo "${PROGDIRS}" | awk -F= '/^LD_LIBRARY_PATH/ {print $2}')
if [ ${#wantDir} -gt 0 ] ; then
echo ""
echo "#LD_LIBRARY_PATH needed."
echo "export LD_LIBRARY_PATH=${wantDir}"
if [ ${doGDB} -eq 1 ] ; then
export LD_LIBRARY_PATH="${wantDir}"
fi
else
echo ""
echo "#LD_LIBRARY_PATH was not found. Can not set it."
fi
wantDir=$(echo "${PROGDIRS}" | awk -F= '/^PATH/ {print $2}')
if [ ${#wantDir} -gt 0 ] ; then
echo ""
echo "#PATH needed."
echo "export PATH=${wantDir}"
export PATH="${wantDir}"
else
echo ""
echo "#PATH was not found. Can not set it."
fi
fi
echo ""
echo "#To start GDB."
echo "gdb ${PROGRAM_NAME} ${CORENAME_FULL}"
if [ ${doGDB} -eq 1 ] ; then
gdb ${PROGRAM_NAME} ${CORENAME_FULL}
fi