内存泄漏检测文章:
mtrace: https://blog.csdn.net/weixin_42887343/article/details/113642463
valgrind: https://blog.csdn.net/weixin_42887343/article/details/113655059
所有工具统计:https://blog.csdn.net/weixin_42887343/article/details/113629076
1 breakpad介绍
google_breakpad是一个由google主导的开源项目,官方介绍为:An open-source multi-platform crash reporting system,即 开源的多平台崩溃上报系统。
这是由google员工在工作中那20%的自由创造时间创造的作品,真正对技术热爱的人才会在自由时间改变世界,只完成工作的人永远只能做一把被人用完就丢的枪。
官方文档介绍:https://github.com/google/breakpad/blob/main/docs/getting_started_with_breakpad.md
2 支持
google breakpad 支持iOS linux windows,但是注意,不支持mingw64。
3 源代码
1 下载
下载地址:https://code.google.com/p/google-breakpad/ 访问不了请挂VPN
github地址:https://github.com/google/breakpad
2 项目源码结构 (主要在src的目录下)
- build: 编译脚本
- client: 主要包括捕获以及dump代码
- common: 通用支持代码
- google_breakpad: breakpad使用的公共支持代码
- processor: 崩溃处理核心代码
- testing: 测试代码
- third_party: 第三方支持库
- tools: 一些小工具,用于处理dump文件和符号表
4 编译
4.1、window编译方法
参考链接: https://blog.csdn.net/a844651990/article/details/85316627
4.2、linuxu(buntu桌面)
下载源码后,执行下面命令:
./configure
qmake -j4
4.3、linux(嵌入式arm)
./configure --host=[arm-linux-gnueabihf]
qmake -j4
注: --host 携带参数根据平台使用的交叉编译做修改
5 使用
5.1 加入项目
使用动态库的方式加入项目,以qt为例,需要将编译好的动态库和头文件加入项目文件夹中,然后在项目的pro文件中添加代码,如下图所示:
5.2 函数调用
//添加头文件
#include "client/linux/handler/exception_handler.h"
//crash回调函数
static bool dumpCallback(const google_breakpad::MinidumpDescriptor &descriptor,
void *context,
bool succeeded)
{
Q_UNUSED(context)
printf("Dump path: %s\n", descriptor.path());
return succeeded;
}
int main(int argc, char *argv[])
{
// 加载崩溃信息捕获
QString curDateTime = QDateTime::currentDateTime().toString("yyyyMMddhhmmss");
QDir dir(DMP_ROOT + curDateTime);
if(!dir.exists())
{
dir.mkpath(DMP_ROOT + curDateTime);
}
google_breakpad::MinidumpDescriptor descriptor(QString(DMP_ROOT + curDateTime).toStdString());
google_breakpad::ExceptionHandler eh(descriptor,
NULL,
dumpCallback,
NULL,
true,
-1);
//你的其他代码
return a.exec();
}
5.3 dmp文件转可读文件
下文仅讲述linux下的操作。
1、使用dump_syms生成符号表:
dump_syms project > project.sym
注: project 为 运行程序
2、创建有层次的调试符号文件夹
- 查看文件层次
head -n1 project.sym
- 创建文件夹
mkdir -p ./symbols/project/ 5F5A4C932BFF6581E5AB30B67D9AA5180/
- 将project.sym拷贝到上一步骤文件夹下
cp project.sym symbols/project/ 5F5A4C932BFF6581E5AB30B67D9AA5180/
3、利用minidump_stackwalk分析dump文件
minidump_stackwalk f35daf9d-25a4-4706-d3f62d89-72d1b3c7.dmp ./symbols > result_f35daf9d.log
最终生成的result_f35daf9d.log就是可读文件。