#! /bin/sh
if test $# -ne 1; then
echo "Usage: `basename $0 .sh` <corefile>" 2>&1
exit 1
fi
if [ $# -eq 1 -a ! -f $1 ]; then
echo "Core file<$1> not found." 2>&1
exit 2
fi
COREFILE=$1
CURRENT_DIR=`pwd`
#get EXENAME
GDB=${GDB:-/usr/bin/gdb}
[ -f $COREFILE.info.out ] && mv $COREFILE.info.out $COREFILE.info.out.bak
$GDB --quiet -nx core $COREFILE <<EOF >$COREFILE.info.out 2>&1
quit
EOF
EXENAME=`cat $COREFILE.info.out | grep "Core was generated" | awk -F'\`' '{print $2;}' | awk '{print $1;}' | sed "s/'.*$//"`
[ -z "$EXENAME" ] && echo $COREFILE is not a core dump && exit 3
ABSEXE=$EXENAME
#The ABSEXE may be not complete due to gdb line buffer len limites
#for some IAP case,just get the /usr parts
[ ! -f $ABSEXE ] && ABSEXE=` echo $ABSEXE | sed -e 's/.*\(\/usr.*\)/\1/g' |awk -F'.' '{print $1;}' `
ABSCORE=`echo $COREFILE | grep ^\/`
[ -z "$ABSCORE" ] && ABSCORE="$CURRENT_DIR/$COREFILE"
COREBASE=`basename $ABSCORE`
#check available disksize,default 500M
echo "checking available disksize..."
DISK_ALLOWED=500
CORE_FILE_SIZE=`du -k $ABSCORE |awk '{print $1;}'`
ESTIMATE_TAR_FILE_SIZE=` expr $CORE_FILE_SIZE \* 2 \/ 1000`
DISK_AVAIL=`df -kP $CURRENT_DIR | awk '{print $4;}' | grep -v Available`
DISK_AVAIL=` expr $DISK_AVAIL \/ 1000`
echo $CURRENT_DIR available about $DISK_AVAIL M
[ $DISK_AVAIL -lt $DISK_ALLOWED ] && echo Available is less than minimum $DISK_ALLOWED. can not proceed. && exit 1
if [ $DISK_AVAIL -lt $ESTIMATE_TAR_FILE_SIZE ]
then
echo Available less than estimated $ESTIMATE_TAR_FILE_SIZE
echo Force to continue<Y/N>?>\c
read option
[ "$option" != "Y" ] && echo Cancelled. && exit 1
fi
CURRENT_STATION=`hostname`
CORE_STATION=`echo $ABSCORE | awk -F'/' '{print $4;}'`
if [ -z "`echo $CURRENT_STATION | grep STATION_[C-L]`" -a -n "`echo $CORE_STATION | grep STATION_[C-L]`" ] ;then
ROOT_DIR=/diskless/release/hlrrt/root
ADDED_DIR=/diskless/release/$CORE_STATION/added
else
ROOT_DIR=""
ADDED_DIR=""
fi
ABSEXE_TMP=$ABSEXE
[ ! -f $ABSEXE ] && ABSEXE=$ADDED_DIR$ABSEXE_TMP
[ ! -f $ABSEXE ] && ABSEXE=$ROOT_DIR$ABSEXE_TMP
[ ! -f $ABSEXE ] && echo "$ABSEXE not exist." && exit 4
EXEBASE=`basename $ABSEXE`
PACKNAME=pack.$EXEBASE.$COREBASE.tgz
[ -f $PACKNAME ] && echo "$PACKNAME already exist in $CURRENT_DIR, pls rm first" && exit 5
echo ***Get on site information,pls wait...***
FILELIST=$CURRENT_DIR/manifirst.list
[ -f $FILELIST ] && echo "$FILELIST exists,pls rm it first" && exit 11
#get shared so list
#Run GDB, strip out unwanted noise.
GDB=${GDB:-/usr/bin/gdb}
$GDB --quiet $readnever -nx $ABSEXE $COREFILE <<EOF >>$COREFILE.info.out 2>&1
quit
EOF
SO_LIST=$COREFILE.so.list
#get shared lib list per .info.out
rm -rf $SO_LIST $SO_LIST.added $SO_LIST.tmp
touch $SO_LIST $SO_LIST.added $SO_LIST.tmp
cat $COREFILE.info.out | awk '/No such/{print $1}/Loaded symbols/{print $NF;}' | awk -F: '{print $1}' >$SO_LIST.tmp
cat $SO_LIST.tmp | while read image
do
if [ -f $ADDED_DIR$image ]
then
if [ -z "`grep $ADDED_DIR$image $SO_LIST`" -a -z "`grep $ADDED_DIR$image $SO_LIST.added`" ]
then
echo $ADDED_DIR$image >>$SO_LIST
[ -n "$ADDED_DIR" ] && echo $image >>$SO_LIST.added
fi
elif [ -f $ROOT_DIR$image ]
then
[ -z "`grep $ROOT_DIR$image $SO_LIST`" ] && echo $ROOT_DIR$image >>$SO_LIST
fi
done
cat $SO_LIST >$FILELIST
echo $SO_LIST >>$FILELIST
echo $SO_LIST.tmp >>$FILELIST
echo $SO_LIST.added >>$FILELIST
echo $ABSEXE >>$FILELIST
echo $ABSCORE >>$FILELIST
echo $COREFILE.info.out >>$FILELIST
#generate gdb scripts
gdb_script="load_symbol"
[ -f $gdb_script ] && mv $gdb_script $gdb_script.bak
touch $gdb_script
rbin=` echo $ABSEXE | cut -c 2-`
rcore=` echo $ABSCORE | cut -c 2-`
SO_DIR=`echo $ROOT_DIR | cut -c 2-`
SO_ADDED_DIR=`echo $ADDED_DIR | cut -c 2- `
cat $SO_LIST.added |while read image
do
imagedir=`dirname $image`
echo "shell [ ! -d ./$SO_DIR$imagedir ] && mkdir -p ./$SO_DIR$imagedir" >>$gdb_script
echo "shell [ ! -f ./$SO_DIR$image ] && cp ./$SO_ADDED_DIR$image ./$SO_DIR$image " >>$gdb_script
done
echo set solib-absolute-prefix ./$SO_DIR >>$gdb_script
echo set solib-search-path ./$SO_DIR >>$gdb_script
echo file $rbin >>$gdb_script
echo core $rcore >>$gdb_script
echo $gdb_script >>$FILELIST
echo $FILELIST >>$FILELIST
echo ***Packaging files...***
#pack all files in
tar cvzfh $PACKNAME -T $FILELIST
#remove temp files
rm -rf $FILELIST $gdb_script $SO_LIST $SO_LIST.tmp $SO_LIST.added $COREFILE.info.out
echo "===DONE, $PACKNAME generated at current dir==="
gpackcore tool
最新推荐文章于 2022-06-17 09:53:26 发布