Linux/Windows下的崩溃调试技术-qBreakpad

Linux使用Breakpad 生成dump文件以及分析工具

0. 前言

在Windows系统中,当程序发生崩溃时,为了捕获和分析崩溃原因,通常可以使用dump文件,dump文件又可以分为:mini-dump 和 full-dump

mini-dump

定义:全称小存储器转储文件记录,它包含了可以确定计算机为什么意外终止的最小有用信息集合。
特点:通常很小,只有几KB到几十KB不等,因此很容易通过电子方式发送给软件开发人员。
包含了Stop消息及其参数、加载的驱动程序列表、已停止的处理器、进程和线程的上下文等信息。
由于包含的信息有限,可能无法定位非正在运行的线程出现问题时导致的错误。
用途:在硬盘空间有限或需要快速分析时,mini-dump非常有用。

full-dump(Full User-Mode Dump 或 Complete Dump)

定义:Full Dump包含了进程的整个内存空间,以及程序的image、handle table等完整的调试信息。
特点:通常非常大,因为它包含了崩溃时进程的全部内存内容、提供了最完整的崩溃信息,可以帮助开发者精确地定位问题、由于文件较大,传输和分析可能需要更多时间和资源。
用途:在需要深入分析崩溃原因或定位复杂问题时,Full Dump是最佳选择。

在不同平台下的实现原理:
Windows:通过SetUnhandledExceptionFilter()设置崩溃回掉函数
Linux:监听 SIGILL SIGSEGV 等异常信号 获取崩溃事件
Max OS:监听 Mach Exception Port 获取崩溃事件

1. 版本说明:

breakpad 包含了一系列组件,包含客户端、服务端等组件,他们共同实现了一个崩溃报告系统

2024.05.31 下载自Github 最新版本
https://github.com/google/breakpad

2. 编译

注意:编译时可能会提示缺少文件:lss/linux_syscal_support.h ,搜索下载即可

开始编译:

./configure --prefix=$PWD/build
make -j8
make install

以上指令将构建以下工具:

minidump_statckwalk.exe (Windows/Linux)
minidump_dump.exe (Windows/Linux)
dump_syms (Linux)
minidump-2-core (Linux)

3. QtCreator调试定位

  • 使用 minidump-2-core -v 工具根据dump文件生成GDB需要的核心转储文件(计算机程序在异常终止时记录下来的内存状态)
minidump-2-core -v 28d9f41f-9a3e-4a29-d0f735a9-6ed1382c.dmp > core.out
  • 打开QtCreator -> Debug -> Start Debugging -> Load Core File…选择上面的core.out,选择带Debug信息的可执行文件

注意是项
1、在编译的时候,需要在Release版程序中生成调试信息,也就是说需要生成pdb文件
2、使用strip -s App_With_Debug_Info() 将调式信息剥离 -> App(发给客户使用)

附录:

linux下导出符号表的脚本
注意:如果要在Qt下生成符号表信息,需要在pro文件中加入以下两行:
QMAKE_CXXFLAGS += -g (必须)
QMAKE_LFLAGS += -Wl,-g
这样可以生成带有调试信息的程序

#!/bin/bash

# Create by chentao 20210917
# Usage for dump.sh 
# /> ./dump.sh ./exec ./SYM
# The result SYM folder will contains as following:

# ├── symbols
# │   └── GateWay_Linux
# │       └── 2993E4B3830896E4463651A4CD41A64E0
# │           └── GateWay_Linux.sym
# └── *.txt

# Analyze dmp file
# /> minidump_stackwalk *.dmp ./SYM/symbols > result.txt

set -e
set -u

DBG_INFO=$(realpath ${1})
DUMPS_DIR=$(realpath ${2:-$PWD/dumps})
DUMP_SYMS=${3:-/home/ct/Documents/WinSVN/QtCommonModules/qBreakpad/third_party/breakpad/src/tools/linux/dump_syms/dump_syms}
STAK_WALK=${4:-/home/ct/Documents/WinSVN/QtCommonModules/qBreakpad/third_party/breakpad/src/processor/minidump_stackwalk}

#
# Generate debug symbols
#
base=$(basename $DBG_INFO)
$DUMP_SYMS $DBG_INFO > $DUMPS_DIR/$base.sym

#
# Create dump dir structure
#
list=($(head -n1 $DUMPS_DIR/$base.sym))
hash=${list[3]}
mkdir -p $DUMPS_DIR/symbols/$base/$hash
mv $DUMPS_DIR/$base.sym $DUMPS_DIR/symbols/$base/$hash

#
# Produce stack trace
#
RED='\033[0;36m'
NC='\033[0m' # No Color
tree $DUMPS_DIR
for dmp in $DUMPS_DIR/*.dmp ; do
    filename=$(basename -- "${dmp}")
    filename="${filename%.*}"
    echo -e "generating stack trace for -> ${RED}${dmp}${NC}"
    $STAK_WALK ${dmp} $DUMPS_DIR/symbols > $DUMPS_DIR/${filename}.txt 2>/dev/null
done

使用Qt实现了一个dump文件分析工具:
https://download.csdn.net/download/ct6816678/89617026

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值