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. breakpad源码编译
注意:编译时可能会提示缺少文件: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(发给客户使用)
4. 生成符号表信息(Linux 下 sym, win下 pdb文件)
在Qt Release模式下生成符号表信息,需要在pro文件中加入以下两行:
# Linux下 Qt的Release模式下生成调试信息的可执行文件,然后使用工具dump_syms生成sym符号表
QMAKE_CXXFLAGS += -g #必须
# msvc下生成pdb文件:
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
Qt在Rlease下生成崩溃信息, 最好放到breakpad.pri中:
msvc:CONFIG(release, debug|release) {
QMAKE_CFLAGS_RELEASE -= -O2 # Remove C optimization
QMAKE_CFLAGS_RELEASE += -Zi # Generates debug information into pdb file
QMAKE_CXXFLAGS_RELEASE -= -O2 # Remove C++ optimization
QMAKE_CXXFLAGS_RELEASE += -Zi # Generates debug information into pdb file
QMAKE_LFLAGS_RELEASE -= /INCREMENTAL:NO # Remove INCREMENTAL link
QMAKE_LFLAGS_RELEASE += /DEBUG # Generates debug information into exe file
message("Turn off optimization and generates debug information for MSVC compiler")
}
mingw:CONFIG(release, debug|release