在Qt中使用asan检测内存泄漏(二)--检查依赖库的内存使用

在前一篇在Qt中使用asan检测内存泄漏(一)-CSDN博客中,我介绍了如何在QT程序里集成asan。一个真实的项目往往包含多个so库。asan如何检查这些库的内存使用呢?这是本篇博文回答的问题。

这里我们使用gdal3.5.3作为so库示例。为了回答上面的问题,我故意在其源码中制造一处内存泄漏点,然后编译并安装gdal。再在我的Qt程序里集成gdal库。最后通过asan检测运行的程序,观察内存检测的结果。

目录

[1 制造内存泄漏点](#1 制造内存泄漏点)

[2 编译gdal并配置.bashrc](#2 编译gdal并配置.bashrc)

[2.1 编译](#2.1 编译)

[2.2 配置.bashrc](#2.2 配置.bashrc)

[3 编译Qt程序](#3 编译Qt程序)

[4 运行程序并观察asan输出](#4 运行程序并观察asan输出)

[5 总结](#5 总结)


1 制造内存泄漏点

在gdal-3.5.3/frmts/gdalallregister.cpp的GDALAllRegister函数开头增加malloc,但是不释放:

2 编译gdal并配置.bashrc

2.1 编译

编译gdal也要支持asan。具体参考CMake编译gdal3.5.3_gdal 3.5.-CSDN博客中Debug版(带asan)的描述。但是由于我已经在/opt/gdal里安装了一个"正常"(无内存泄漏)的gdal版,所以这里把含有内存泄漏的gdal安装在另一个路径/opt/1gdal1路径下。

2.2 配置.bashrc

此外,程序运行不能再调用"正常"的gdal库,所以还要修改~/.bashrc,把LD_LIBRARY_PATH中的gdal路径改为/opt/1gdal1/lib64:

然后运行 source ~/.bashrc使之生效。

3 编译Qt程序

Qt程序与在Qt中使用asan检测内存泄漏(一)-CSDN博客的项目相比,只有两处区别:

1)pro文件里不再依赖/opt/gdal/,而是/opt/1gdal1/

bash 复制代码
INCLUDEPATH += /opt/1gdal1/include
LIBS += -L/opt/1gdal1/lib64 -lgdal

2)恢复delete \[\] pImgData;这段代码,因为本文研究的是gdal库带来的内存泄漏,而不是项目的main函数自己带来的泄漏。

程序已打包上传【免费】asan检测gdal库的内存泄漏示例资源-CSDN下载

4 运行程序并观察asan输出

运行程序:

bash 复制代码
ASAN_OPTIONS=detect_leaks=1 ./ASAN

由于我的程序的main函数里调用了GDALAllRegister()函数,所以必然造成内存泄漏:

cpp 复制代码
int main(void)
{
    GDALAllRegister();
......

输出:

可见,asan准确输出了内存泄漏的位置

5 总结

只要在

1)编译gdal源码时明确使用asan,

2)在.bashrc中明确调用使用了asan的库,

3)在pro文件里(通过asan.pri)明确使用asan,并链接使用asan的gdal库,

4)运行程序是明确ASAN_OPTIONS=detect_leaks=1

就能探测到gdal库的泄漏位置。

最后不要忘记删除这个有问题的gdal库,进入源码目录下的build文件夹,然后输入

sudo xargs rm -v < install_manifest.txt

并修改.bashrc。

相关推荐
StarsGreen1 小时前
libva在intel平台上的前端流程简介
linux
慧都产品智能化2 小时前
Qt 表格升级攻略:复用已有编辑器,减少重复开发
c++·qt·编辑器·qt6.3
ShineWinsu2 小时前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
ShineWinsu4 小时前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem
坤坤子吖4 小时前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json
Felven6 小时前
华为鲲鹏920s芯片serdestool工具使用说明
linux·运维·服务器·华为·鲲鹏920·serdestool
莫晓燚6 小时前
mall 电商项目完整部署---实战
linux·运维·docker·容器
咋的啥名都用不了呢~6 小时前
Linux项目部署5(安装Nginx的插件)
linux
CodeYp20196 小时前
第11讲:应用层协议 HTTP
linux·http
爱和冰阔落6 小时前
【Linux网络】JsonCpp 怎么实现序列化?从 Request/Response 到网络计算器消息设计
linux·运维·网络·php