C++(Qt)软件调试---内存调试器Dr.Memory(21)
C++(Qt)软件调试—内存调试器Dr. Memory(21)
  文章目录
 - C++(Qt)软件调试---内存调试器Dr. Memory(21)
 - @[toc]
 - 1、概述🐜
 - 2、安装Dr.Memory🪲
 - 3、命令行使用Dr.Memory🦗
 - 4、Qt Creator集成使用Dr.Memory🐉
 - 1.1 以外部工具启动
 - 1.2 以运行配置启动
 
 - 5、Visual Studio集成使用Dr.Memory🐑
 - 6、Dr.Memory选项🪰
 - 7、常见问题及解决办法🐐
 - 8、参考🐹
 
 
 
 
文章目录
- C++(Qt)软件调试---内存调试器Dr. Memory(21)
 - @[toc]
 - 1、概述🐜
 - 2、安装Dr.Memory🪲
 - 3、命令行使用Dr.Memory🦗
 - 4、Qt Creator集成使用Dr.Memory🐉
 - 1.1 以外部工具启动
 - 1.2 以运行配置启动
 
- 5、Visual Studio集成使用Dr.Memory🐑
 - 6、Dr.Memory选项🪰
 - 7、常见问题及解决办法🐐
 - 8、参考🐹
 
| 更多精彩内容 | 
|---|
| 👉内容导航 👈 | 
| 👉C++软件调试、异常定位 👈 | 
1、概述🐜
Dr. Memory 是一种开源内存监控工具,能够识别与内存相关的编程错误。例如
- 内存泄漏检测
 - 内存越界检测
 - 重复释放内存
 - 空指针、野指针检测
 - 堆栈溢出检测
 - 内存分配和释放跟踪
 - (在 Windows 上)句柄泄漏检测
 - GDI API 使用错误以及访问未保留的线程本地存储槽
 同类型工具还有Valgrind、Deleaker 、Asan、VLD、heob等;
- Valgrind不适应于Windows;
 - Asan速度快,但在Windows上也不是很好用,VS2019以后版本开始支持,linux下使用;
 - Deleaker 是windows下Valgrind的替代,不过是收费的;
 - VLD支持Windows,以头文件引入,简单易用;
 - Heob适用于Windows,可集成到Qt Creator;
 - Dr.Memory开源免费,支持跨平台,不需要参与程序编译。
 在性能上Dr. Memory 比包括 Valgrind 在内的同类工具更快。(有时候还是有点慢)
本文会讲解如何使用Dr.Memory以及在Qt Creator和Visual Studio中集成Dr.Memory。
演示环境:
-  
系统:
- Windows11
 
 -  
编辑器:
- Visual Studio 2017
 - Qt Creator10.0.2
 - VS Code
 
 -  
编译器:
- MSVC2017-32
 - MSVC2017-64
 - MinGW32
 - MinGW64
 
 -  
Dr.Memory版本
- DrMemory-Windows-2.6.19989.msi
 - DrMemory-Windows-2.3.18696.zip
 - DrMemory-Windows-2.4.18900.zip
 
 
2、安装Dr.Memory🪲
支持系统:Windows、Linux 和 Mac 系统。
支持编译器:g++、MinGW、MSVC。
目前不支持使用 Cygwin、gcc 或 g++ 构建的应用程序。
使用Dr.Memory需要包含调试符号。
详细说明
下载 (drmemory.org)
github下载
-  
这里我使用的是DrMemory 2.3、2.4、2.6三个版本;
- 2.6版本适用于MSVC2017-64、MinGW64,不适用于MSVC2017-32、MinGW32;
 - 2.3、2.4版本适用于MSVC2017-32、MSVC2017-64、MinGW64,不适用于MinGW32。
 
 -  
下载完成后直接双击进行安装,安装目录为
D:\DrMemory; -  
如果是使用**.msi安装包**进行安装的会自动添加到环境变量;
 -  
如果是使用**.zip压缩包**,那解压后可选择添加到环境变量,或者使用时用绝对路径访问。
 

3、命令行使用Dr.Memory🦗
测试代码
/****************************************************************** \file   ConsoleApplication4.cpp* \brief  测试Dr.Memory代码,如果编译不通过则打开属性、C/C++、常规、关闭SDL检查* * \author MHF* \date   September 2024*********************************************************************/
#include <iostream>using namespace std;// 内存泄漏
void test1()
{int*p = new int;cout << p << endl;
}// 非法访问内存
void test2()
{char *p = new char[10];delete[] p;*p = 123;
}
// 使用未初始化变量
void test3()
{int a;int b = a;
}
// 重复释放内存
void test4()
{char * p = new char;free(p);free(p);
}int main()
{test1();test2();test3();test4();cout << "hello" << endl;return 0;
} 
- 编译完成后,进入可执行程序所在路径;
 - 鼠标右键选择【在终端中打开】或者打开cmd进入可执行程序所在路径;
 

- 输入
drmemory.exe -ignore_kernel .\ConsoleApplication4.exe指令启动Dr.Memory调试; - 注意:drmemory.exe如果在环境变量中无法访问到则需要使用绝对路径;
 - 启动时一般会报异常,弹出弹窗,则需要使用
-ignore_kernel选项,再出现弹窗,点击确认后就可以生成分析报告。-ignore_kernel选项跳过在不受支持的内核版本上运行的通常致命的使用错误,继续向下执行。
 - 检测完成后默认会自动打开分析报告文件。
 


- 默认生成检测报告文件位置如下图所示,默认生成路径为用户目录下或者DrMemory安装路径下: 
C:\Users\MHF\AppData\Roaming\Dr. MemoryD:\DrMemory-2.3\drmemory\logs\
 

- 使用
-logdir选项可指定检测报告的生成路径 

4、Qt Creator集成使用Dr.Memory🐉
在Qt Creator中有两种方式运行Dr.Memory。
- 以外部工具启动:
 
- 一次配置适用于所有工程、多个编译器;
 - 可添加依赖库环境变量;
 - 可配置快捷键启动;
 - 需要使用时再运行。
 - 以运行配置启动:
 
- 一次配置只适用于当前配置的工程、当前配置的编译器;
 - 可添加依赖库环境变量;
 - 不能配置快捷键启动;
 - 每次程序编译运行时都会启动。
 
1.1 以外部工具启动
-  
打开【编辑】【Preferences】,打开【首选项】窗口;

 -  
选择【环境】【外部工具】【添加】,名称命名为
Dr.Memory;
 -  
主要需要配置【执行档】【参数】【Base environment】3项;
-  
执行档: Dr.Memory可执行程序路径;
 -  
参数: Dr.Memory程序运行的参数,其中可使用QT内置的宏来替换可执行程序路径、输出文件路径等;
 -  
Base environment: 程序运行所需的环境变量,如果选择【系统环境变量】则当环境变量中找不到Qt动态库时则Dr.Memory会运行失败,所以如果是使用到Qt库的程序,可选择【Curent Build Environment】或者【Curent Run Environment】,这样程序运行时会自动链接到Qt动态库。如果有第三方依赖,则可在【环境】项中添加对应的依赖环境变量。
 -  
QT内置宏使用: 在【参数】项输入栏右侧点击图标,在打开的窗口中选择内置宏,不同版本的Qt Creator内置宏有一定区别;


 -  
配置完成后我的参数是
-logdir %{CurrentDocument:Project:RunConfig:Executable:NativePath} -lib_blocklist "*.dll" -ignore_kernel -- %{CurrentDocument:Project:RunConfig:Executable:FilePath}; -  
然后点击【确认】后,就可以在【工具】【外部】【Dr.Memory】启动Dr.Memory检测当前程序;

 -  
如果觉得每次都打开菜单很麻烦,则可选择配置快捷键;
 -  
打开【首选项】【环境】【键盘】,过滤器输入
Dr.Memory; -  
选中【Dr.Memory】项后,点击【Record】,然后按下自己习惯的快捷键组合,就可以设置Dr.Memory启动快捷键了,注意快捷键不要存在冲突。

 -  
按下快捷键后启动Dr.Memory,启动会比较慢,注意Dr.Memory在程序运行结束后才会给出报告,所以当程序运行后,退出程序运行,然后才会打开检测报告。

 
 -  
 
1.2 以运行配置启动
-  
点击【项目】,在【构建和运行】中选中编译器【运行】;

 -  
选中编译器的【运行】后,在【运行】项中点击【添加】【自定义执行档】;
 -  
【执行档】输入Dr.Memory路径;
 -  
【Command line arguments】输入Dr.Memory参数;
 -  
【工作目录】这里设置的是运行目录,用于在
-logdir ./指定生成检测报告的路径; -  
在【环境】项中找到【Path】项,选中后点击【Edit】,添加当前编译器的动态库路径或者使用到的其它依赖库路径,便于运行时通过环境变量链接到动态库,否则找不到动态库则会运行失败。


 -  
配置完成后,直接编译运行程序,就会自动启动Dr.Memory进行检测分析;

 
5、Visual Studio集成使用Dr.Memory🐑
在“工具”菜单上添加和管理外部工具 - Visual Studio (Windows) | Microsoft Learn
-  
在菜单栏选中【工具】【外部工具】;

 -  
打开【外部工具】窗口后,点击【添加】,分别输入标题、命令、参数,输入栏右侧的三角形图标按键打开可选择使用VS内置宏;

 -  
编译完成程序后可点击【工具】【Dr.Memory】选项启动Dr.Memory对当前可执行程序进行分析;

 -  
如果觉得打开菜单操作复杂,可以选择给外部工具命令添加快捷键;
 -  
点击【工具】【选项】;

 -  
打开【选项】窗口后,选择【环境】【键盘】,在【显示目录包含】位置输入工具.外部命令;
 -  
由于我的Dr.Memory是第四条命令,所以我选择的是工具.外部命令4,选中选项后鼠标点击下方的【按快捷键】输入栏,然后按下设置的快捷键组合,如果快捷键已经被使用了则会在【快捷键的当前使用对象】位置显示,如果没被使用则点击【分配】,然后点击确认就设置完成了。

 
6、Dr.Memory选项🪰
- 在线文档
 - 离线文档:安装路径下
D:\DrMemory\docs。 
7、常见问题及解决办法🐐
-  
Dr.Memory检测所有动态库,导致速度慢,生成的报告文件内容非常多,大部分都是无效内容;
- 使用
-lib_blocklist选项指定动态库不进行检测; 
 - 使用
 -  
生成的检测报告文件找不到在哪;
- 默认生成路径在用户目录下或者Dr.Memory安装路径下;
 - 可使用
-logdir选项指令生成路径; 
 -  
在检测完成后没有打开报告文件;
- 可能是使用了
-visual_studio选项; 
 - 可能是使用了
 -  
初次运行Dr.Memory启动很慢;
-  
显示内容如下所示:
WARNING: System call information is missing for this operating system version. Attempting to auto-generate system call information... drsys_find_sysnum_libs: C:\Windows\system32\ntdll.dll is readable drsys_find_sysnum_libs: C:\Windows\system32\kernelbase.dll is readable drsys_find_sysnum_libs: C:\Windows\system32\kernel32.dll is readable drsys_find_sysnum_libs: C:\Windows\system32\gdi32.dll is readable drsys_find_sysnum_libs: C:\Windows\system32\imm32.dll is readable drsys_find_sysnum_libs: C:\Windows\system32\user32.dll is readable drsys_find_sysnum_libs: C:\Windows\system32\win32u.dll is readable drsys_find_sysnum_libs: C:\Windows\system32\ntdll.dll is readable drsys_find_sysnum_libs: C:\Windows\system32\kernelbase.dll is readable drsys_find_sysnum_libs: C:\Windows\system32\kernel32.dll is readable drsys_find_sysnum_libs: C:\Windows\system32\gdi32.dll is readable drsys_find_sysnum_libs: C:\Windows\system32\imm32.dll is readable drsys_find_sysnum_libs: C:\Windows\system32\user32.dll is readable drsys_find_sysnum_libs: C:\Windows\system32\win32u.dll is readable Symbol cache directory is "D:\DrMemory-2.3\drmemory\logs\symcache" Fetching symbols for "C:\Windows\system32\ntdll.dll", attempt #0 Successfully fetched or found symbols at "D:\DrMemory-2.3\drmemory\logs\symcache\symbols\ntdll.pdb\3F9B0A9DA2F01CB5571242F6EE73BFD61\ntdll.pdb" Fetching symbols for "C:\Windows\system32\kernelbase.dll", attempt #0 -  
默认会检测所有动态库,所以初次启动时会查找所有动态库的pdb符号表,所以会比较慢。
 
 -  
 -  
启动Dr.Memory时出现弹窗,内容如下所示:
~~Dr. M~~ System call information is missing for this operating system: WinVer=105;Rel=2009;Build=22631;Edition=CoreCountrySpecific. Restarting to trigger auto-generation of system call information. Re-run with -ignore_kernel to attempt to continue instead.- 使用
-ignore_kernel选项后关闭弹窗; - 或者直接关闭弹窗,等下载完符号表后,后续就不会出现了。
 
 - 使用
 -  
Dr.Memory启动失败,提示信息如下所示:
~~Dr.M~~ WARNING: unable to locate results file: can't open E:\test\ConsoleApplication4\Debug\/resfile.66196 (code=2). Dr. Memory failed to start the target application, perhaps due to interference from invasive security software. Try disabling other software or running in a virtual machine. WARNING: Examine the following unusual libraries in this process to help identify invasive software that may have affected the target application:C:\Windows\System32\bcrypt.dllPlease file a bug about this at http://drmemory.org/issues ~~Dr.M~~ WARNING: application exited with abnormal code 0xffffffff- 不同版本的Dr.Memory都可能存在一些问题,例如Dr.Memory2.6用于MSVC2017-32编译的程序时就会失败,改为使用Dr.Memory2.3就正常了。
 
 -  
Dr.Memory启动失败,提示信息如下:
~~Dr.M~~ WARNING: libraries needed by the application are missing. Check that it runs successfully on its own and check that all needed libraries are in its directory or on the PATH. ~~Dr.M~~ WARNING: application exited with abnormal code 0xc0000135- 这是由于需要检测的可执行程序启动失败,找不到依赖库,需要将动态库复制到当前路径下或者将动态库路径添加进环境变量。
 
 
8、参考🐹
drmemory官网
Dr. Memory Runtime 选项参考 (drmemory.org)
用于 MSBuild 命令和属性的常用宏 | Microsoft Learn
标识并自定义键盘快捷方式 - Visual Studio (Windows) | Microsoft Learn
相关文章:
C++(Qt)软件调试---内存调试器Dr.Memory(21)
C(Qt)软件调试—内存调试器Dr. Memory(21) 文章目录 C(Qt)软件调试---内存调试器Dr. Memory(21)[toc]1、概述🐜2、安装Dr.Memory🪲3、命令行使用Dr.Memory🦗4、Qt Creator集成使用Dr.Memory&…...
Python3自带HTTP服务:轻松开启与后台管理
Python3自带有http服务,可以在服务器,也可以在本地启动,并运行一些常用的网页程序。比如:我们可以把streamlit框架编写的网页放到服务器上,开启http服务,就可以通过网页来调用这个pythont程序了,…...
传统行业选择企业大文件传输系统需要注意哪些?
数字化转型的洪流中,传统行业正经历着前所未有的挑战与机遇。随着数据量的激增,企业大文件传输系统的选型成为了一个至关重要的议题。今天小编将深入探讨传统行业在这一过程中的考量因素,并以镭速企业大文件传输系统为例,展示其如…...
如何配置路由器支持UDP
一、UDP协议简介 UDP是一种传输层协议,与TCP(传输控制协议)不同,它不需要建立连接,因此传输速度较快。由于UDP不需要确认数据包的接收状态,它适用于不需要严格数据完整性但需要低延迟的场景。 常见的UDP应…...
CorePress Pro 网站加载慢 WordPress
一般来说是你用了「CorePress天气模块」 解决方案:这个插件从你右侧边栏里删掉就可以了(上方的图中已经是删掉后的效果了) 寻找加载时间长的原因: 谷歌浏览器F12->网络->打开录制->ShiftF5 得出结论:和风天气…...
关于uniapp wifi调用走过的坑
1. uniapp老脚手架与uni-wif带来的兼容性问题 且几乎找不到解决方法 2. uni-wif需要插件市场安装 3.还有一种可以使用导入安卓类的方式,可以正常获取到已经连接ssid(wifi名称),也可以获取到wifi列表 , 但ScanResul…...
docker学习笔记(1.0)
docker命令 下载镜像相关命令 检索:docker search 比如:docker search nginx 是查看有没有nginx镜像 后面的OK表示是不是官方镜像,如果有就是官方镜像,如果没有就是第三方的。 下载:docker pull 比如:…...
如何高效管理知识产权全链条?
为了有效保护企业的创新成果,确保技术创意的顺利转化,以及高效管理知识产权案件,建立一套完善的知识产权管理体系至关重要。对于企业而言,如何有效地管理知识产权的各个环节,从研发项目到技术创意,再到提案…...
禾赛嵌入式面试题及参考答案(2万字长文)
TCP/IP 的连接建立(三次握手)和断开过程(四次挥手) 连接建立(三次握手): 第一次握手:客户端向服务器发送一个 SYN(同步)包,这个包中包含客户端选择的初始序列号(Sequence Number)。此时客户端进入 SYN_SENT 状态,表示客户端已发送 SYN 包等待服务器确认。 第二…...
C++进阶知识1继承
继承 1. 继承的概念及定义1.1 继承的概念1.2 继承定义1.2.1 定义格式1.2.2 继承基类成员访问⽅式的变化 1.3 继承类模板 2. 基类和派⽣类间的转换3. 继承中的作⽤域3.1 隐藏规则: 4. 派⽣类的默认成员函数4.1 4个常⻅默认成员函数4.2 实现⼀个不能被继承的类 5. 继承…...
vue中使用exceljs和file-saver插件实现纯前端表格导出Excel(支持样式配置,多级表头)
实现:使用Excel.js库创建excel文件,然后再使用 file-saver库将 Excel 文件保存到用户的本地计算机。 1.安装,可以使用npm,yarn npm install exceljs npm install file-saver 2.封装生成excel的方法 // 封装exceljs const ExcelJ…...
C语言编写一个五子棋游戏-代码实例讲解与分析
编写一个完整的五子棋游戏(Gomoku 或 Gobang)在C语言中是一个相对复杂的任务,因为它涉及到用户界面的处理、游戏逻辑的维护以及可能的AI对手设计。在这里,我将提供一个简化的版本,这个版本将使用控制台来接收用户输入&…...
Linux——k8s组件
kubernetes 使用1.31.1 版本搭建集群核心组件,选择flannel 网络插件为整体集群的运行提供网络通信功能。 flannel 网络插件 kube-flannel kube-flannel-ds-9fgml 1/1 Running 1 (18m ago) 2d21h kube-flannel kube-flannel-ds-ghwbq …...
基于RustDesk自建远程桌面服务
最近向日葵越来越难用了,官方好像限制了免费用户的带宽,但是限制的有点过头了,卡的基本没法用。 向日葵的平替todesk对于免费用户又有时长限制,对于经常用的小伙伴不大友好。 咱也不是说非得白嫖,但是向日葵和todesk这…...
Devicenet从站数据 转profinet IO项目案例
目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 网关用DEVICENET协议采集数据 3 5 用PROFINET IO协议转发数据 4 6 案例总结 7 1 案例说明 设置网关采集Devicenet从站设备数据把采集的数据转成profinet IO协议转发给其他系统。 2 VFBOX网关工作原理 VFBOX网关是协…...
C语言实现队列
队列 前言一、队列的结构1.实现思路2.代码结构 二、队列的实现1.初始化和销毁2.判空和获取队列大小3.入队列和出队列4.获取队头和队尾元素5.测试 总结每文推荐 前言 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操…...
Python使用scrapy创建项目爬虫步骤
一、安装导入 使用包管理器下载 pip install scrapy 二、创建Scrapy项目 首先需要进入你创建项目的目录下,打开cmd窗口或powershell窗口: scrapy startproject 项目名称(英文) 三、了解项目结构 scrapy.cfg # 项目的配置文件…...
长沙某公司.Net高级开发面试题
1.dot net core跟dot net比较有哪些更好的地方? 第一是跨平台,它可以运行在三大操作系统上面,windows, Linux和MAC。 第二是对架构本身安装没有依赖,因为所有的依赖都跟程序本身在一起。 第三是dot net core处理请求…...
物联网系统中声音拾取音频方案_咪头
01 物联网系统中为什么要使用咪头 物联网系统中使用咪头(麦克风或传声器)的原因主要可以归结为以下几个方面: 声音信号的拾取与转换 基本功能:咪头是一种将声音转换为电信号的装置。在物联网系统中,咪头负责捕捉周围…...
【题解】Codeforces Round 975 (Div. 2) A~E
A. Max Plus Size 分别假设答案为取第偶数位的最大值和取第奇数位的最大值两种情况, 取更优解. 取偶数位的最大值时, 把所有其他都偶数位都取上. 奇数同理. code: int solve(int _) {int n;cin >> n;vector<int>a(n 1);int Maxj 0, Maxo 0;for (int i 1; i …...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
