gdb 自动调试
记录一些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