gdb 自动调试

发布时间 2023-08-24 10:00:54作者: xcywt

记录一些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:是生成的崩溃文件。

 

整了一个脚本:

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