记录一些GDB调试相关的东西。
coredump设置无限大小。
ulimit -c unlimited
调整core生成的目录:如下就是指定生成在【/home/dadao/DDR_Linux/Server/coreTmp】目录下。
sudo bash -c 'echo "/home/dadao/DDR_Linux/Server/coreTmp/core.%e.%t" > /proc/sys/kernel/core_pattern'
自动将调用堆栈打印出来。如下:就是自动将coredump文件进行调试,会打印出来调用堆栈。可以自行重定向到指定文件中,方便统计问题。
gdb --batch --quiet -ex "thread apply all bt full" -ex "quit" MobileServer coreTmp/core.MobileServer.1692778494
MobileServer:是调试程序。
coreTmp/core.MobileServer.1692778494:是生成的崩溃文件。
整了一个脚本:
代码语言:javascript复制echo "GDB调试工具. V0.01 2023.08.23 ... "
echo "本程序运营目录为:[/home/dadao/DDR_Linux/Server], core文件存放的目录为[./coreTmp] ...... "
echo "使用方法:./"$0" exeName coreName"
MYSH_NAME=$0
EXE_NAME=$1
CORE_NAME=$2
if [ -e $EXE_NAME ]; then
echo $EXE_NAME"要调试的程序文件存在"
else
echo $EXE_NAME"要调试的程序文件不存在,请检查"
exit 1
fi
if [ -e $CORE_NAME ]; then
echo $CORE_NAME"core文件存在"
else
echo $CORE_NAME"core文件不存在,请检查"
exit 2
fi
core_file_dir="./coreTmp" # core文件存放的目录
core_file_new=$CORE_NAME # 最终的core文件,若输入为压缩包。则会去掉后面的 .tar.gz
substr=".tar.gz"
if [[ $CORE_NAME == *"$substr"* ]]; then
echo $CORE_NAME"为压缩包,需要解压。"
tar xvf $CORE_NAME -C $core_file_dir # 相当于默认了 AAABBB.tar.gz 解压后的文件名一定是 AAABBB
core_file_new=${CORE_NAME:0:-7} # 直接截取,把.tar.gz去掉.
else
echo $CORE_NAME"无需解压"
fi
v_time=`date " %Y_%m_%d_%H_%M_%S"`
outFile="./LOGS/COREDUMPLOG_"$v_time".txt"
echo "要调试的程序为:"$EXE_NAME" 最终的core文件为:"$core_file_new" 输出文件为:"$outFile
gdb --batch --quiet -ex "thread apply all bt full" -ex "quit" $EXE_NAME $core_file_new > $outFile
cat $outFile # 再把结果输出到终端
if [ "$CORE_NAME" == "$core_file_new" ]; then
echo "处理完毕, 输出文件为 [ *** FBI WARNING:输出文件名为当前时间,不是程序崩溃时间 *** ]:"$outFile
else
echo "处理完毕,将删除:"$core_file_new", 输出文件为 [ *** FBI WARNING:输出文件名为当前时间,不是程序崩溃时间 *** ]:"$outFile
rm $core_file_new
fi