建站教程的实现方式/电商seo优化
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. Memory
D:\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 …...

如何搞定视频裁剪?新手小白零基础剪辑,分享5个实用工具!
现在是一个短视频盛行的时代,几乎每个人都掌握了视频剪辑技能。 不管是因为工作也好,生活也罢,只要有视频,那么就一定会用到视频剪辑软件。视频裁剪已经难不倒普通人了,借助专业的视频裁剪工具,任何人都可…...

HttpClientHandler 详解及使用
在现代网络编程中,HttpClientHandler 是一个至关重要的组件,它提供了对 HTTP 请求的底层配置和控制。本文将详细介绍 HttpClientHandler 的核心概念、配置选项以及如何在实际应用中使用它。 1. 什么是 HttpClientHandler? HttpClientHandle…...

基于两分支卷积和 Transformer 的轻量级多尺度特征融合超分辨率网络 !
当前的单图像超分辨率(SISR)算法有两种主要的深度学习模型,一种是基于卷积神经网络(CNN)的模型,另一种是基于Transformer的模型。前者利用不同卷积核大小的卷积层堆叠来设计模型,使得模型能够更…...

Font Awesome 手势图标
Font Awesome 手势图标 Font Awesome 是一个广泛使用的图标库,它为网页设计师和开发者提供了一系列高质量的图标。这些图标涵盖了从基本的网页元素到复杂的符号和手势,可以轻松地集成到各种网页和应用中。在本文中,我们将重点介绍 Font Awesome 中的手势图标,探讨它们的应…...

基于Hive和Hadoop的哔哩哔哩网站分析系统
本项目是一个基于大数据技术的哔哩哔哩平台分析系统,旨在为用户提供全面的哔哩哔哩视频数据和深入的用户行为分析。系统采用 Hadoop 平台进行大规模数据存储和处理,利用 MapReduce 进行数据分析和处理,通过 Sqoop 实现数据的导入导出…...

Augular 学习步骤建议
Angular 是一个由 Google 维护的开源 Web 应用框架,用于开发单页面客户端应用程序。以下是学习 Angular 的建议步骤: 1. 了解基础: 熟悉 HTML、CSS 和 JavaScript 的基础知识。 了解 TypeScript,因为 Angular 应用程序主要使用…...

突破自闭症治疗进展报道:改变孩子和家庭的未来
在这个充满挑战与希望的时代,自闭症这一复杂的神经发育障碍,长久以来一直是无数家庭心中的痛。然而,在星贝育园这片充满爱与科学的土地上,一场关于自闭症治疗的深刻变革正在悄然发生,它不仅为孩子们点亮了未来的希望之…...

我想注册一批账号做矩阵,需要每次注册都切换一个ip吗
在注册一批账号以建立矩阵时,切换IP地址是一个重要的考虑因素,尤其是为了避免被平台识别为同一用户或多重账户,从而减少账号被封的风险。以下是一些建议,帮助你有效管理IP地址和账号注册过程: 1. 切换IP地址的必要性 …...

linux系统的常用命令
微服务Linux解析部署使用全流程 Linux安装vim超详细教程 Linux安装JDK及配置环境变量超详细教程 Linux安装tomcat及配置环境变量超详细教程 目录 1、ls:列出目录内容。 2、cd:改变当前目录。 3、pwd:打印当前工作目录的路径 4、mkdir…...

无锡卓瓷X哲讯智能科技,SAP项目正式启动!
在数字化浪潮的推动下,高精密陶瓷行业的领军企业—无锡卓瓷科技有限公司,携手哲讯智能科技有限公司近期启动SAP&BI项目,以打造行业领先的数字化管理平台。这一战略举措标志着无锡卓瓷在数字化转型的道路上迈出了坚实的一步。 无锡卓瓷—…...