gpackcore tool

#! /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==="

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值