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++软件调试、异常定位 👈

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. 以外部工具启动:
    • 一次配置适用于所有工程、多个编译器;
    • 可添加依赖库环境变量;
    • 可配置快捷键启动;
    • 需要使用时再运行。
  2. 以运行配置启动:
    • 一次配置只适用于当前配置的工程、当前配置的编译器;
    • 可添加依赖库环境变量;
    • 不能配置快捷键启动;
    • 每次程序编译运行时都会启动。

1.1 以外部工具启动

  1. 打开【编辑】【Preferences】,打开【首选项】窗口;

    在这里插入图片描述

  2. 选择【环境】【外部工具】【添加】,名称命名为Dr.Memory

    在这里插入图片描述

  3. 主要需要配置【执行档】【参数】【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 以运行配置启动

  1. 点击【项目】,在【构建和运行】中选中编译器【运行】;

    在这里插入图片描述

  2. 选中编译器的【运行】后,在【运行】项中点击【添加】【自定义执行档】;

  3. 【执行档】输入Dr.Memory路径;

  4. 【Command line arguments】输入Dr.Memory参数;

  5. 【工作目录】这里设置的是运行目录,用于在-logdir ./指定生成检测报告的路径;

  6. 在【环境】项中找到【Path】项,选中后点击【Edit】,添加当前编译器的动态库路径或者使用到的其它依赖库路径,便于运行时通过环境变量链接到动态库,否则找不到动态库则会运行失败。

    在这里插入图片描述

    在这里插入图片描述

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

    在这里插入图片描述

5、Visual Studio集成使用Dr.Memory🐑

在“工具”菜单上添加和管理外部工具 - Visual Studio (Windows) | Microsoft Learn

  1. 在菜单栏选中【工具】【外部工具】;

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

  4. 如果觉得打开菜单操作复杂,可以选择给外部工具命令添加快捷键

  5. 点击【工具】【选项】;

    在这里插入图片描述

  6. 打开【选项】窗口后,选择【环境】【键盘】,在【显示目录包含】位置输入工具.外部命令

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

    在这里插入图片描述

6、Dr.Memory选项🪰

  • 在线文档
  • 离线文档:安装路径下D:\DrMemory\docs

7、常见问题及解决办法🐐

  1. Dr.Memory检测所有动态库,导致速度慢,生成的报告文件内容非常多,大部分都是无效内容;

    • 使用-lib_blocklist 选项指定动态库不进行检测;
  2. 生成的检测报告文件找不到在哪;

    • 默认生成路径在用户目录下或者Dr.Memory安装路径下;
    • 可使用 -logdir 选项指令生成路径;
  3. 在检测完成后没有打开报告文件;

    • 可能是使用了-visual_studio选项;
  4. 初次运行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符号表,所以会比较慢。

  5. 启动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选项后关闭弹窗;
    • 或者直接关闭弹窗,等下载完符号表后,后续就不会出现了。
  6. 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就正常了。
  7. 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/440981.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MFC工控项目实例二十三模拟量输入设置界面

承接专栏《MFC工控项目实例二十二主界面计数背景颜色改变》 1、在SenSet.h文件中添加代码 #include "BtnST.h" #include "ShadeButtonST.h"/ // SenSet dialogclass SenSet : public CDialog { // Construction public:SenSet(CWnd* pParent NULL); //…

2024Java最新面试题总结(针对于一些小厂、中厂)

这是根据个人面试经历总结出来的一些经验希望可以帮助到有需要的人。 面试的时候&#xff0c;会先让你进行自我介绍&#xff0c;这个大家准备一两分钟的面试稿就可以。然后就是正式面试&#xff0c;面试官一般是两个人以上&#xff0c;开始&#xff0c;面试官会先提问一些基本…

NLP任务之预测最后一个词

目录 1.加载预训练模型 2 从本地加载数据集 3.数据集处理 4.下游任务模型 5.测试代码 6.训练代码 7.保存训练好的模型 8. 加载 保存的模型 1.加载预训练模型 #加载预训练模型 from transformers import AutoTokenizer#预训练模型&#xff1a;distilgpt2 #use_fast…

Sharding 分页原理分析

优质博文&#xff1a;IT-BLOG-CN 如果业务上需要执行如下分页查询&#xff0c;Sharding-JDBC如何执行分页查询的&#xff1f; 官方文档 select * from student_time ORDER BY create_time ASC limit 1000, 5;Sharding-JDBC分页查询时在每个分表中都查询1005条数据&#xff0c…

【Canvas与标牌】盾形银底红带Best Quality Premium标牌

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>BestQulityPremium金属牌重制版Draft2</title><style type&…

笔记本电脑重启输入密码后黑屏

型号&#xff1a;Dell G3 3590 系统&#xff1a;Win10 背景 原本想安装火绒清一清缓存之类的垃圾文件的&#xff0c;安装完火绒之后点击垃圾清理&#xff0c;提示需要更新工具&#xff0c;ok,更新&#xff0c;进度到50%就不动了&#xff0c;然后火绒通知我 发现危险信息&…

基于双PI控制器和SVPWM的定转子双永磁同步电机simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 永磁同步电机的基本结构和工作原理 4.2 双PI控制器的设计方法 4.3 SVPWM 的实现原理 5.完整工程文件 1.课题概述 为了实现定转子双永磁同步电机的高性能控制&#xff0c;通常采用双 PI 控制器和 S…

OpenHarmony中OpenSSL从1.1.1 升级到3.0.7 时不支持MD4算法导致wpa_supplicant报错问题解决

OpenHarmony中OpenSSL从1.1.1 升级到3.0.7 时不支持MD4算法导致wpa_supplicant报错问题解决 1 问题现象 我们在测试EAP-PEAP(MSCHAPV2)功能时发现如下打印,导致认证失败 2 初步分析 openssl_digest_vector 中 调用EVP_DigestInit_ex 时如果报错 会打印"OpenSSL: EVP…

【鸿蒙学习】深入解析鸿蒙应用与元服务:含义、区别、应用场景及创建方法

文章目录 鸿蒙应用&#xff08;HarmonyOS App&#xff09;含义用于干什么优缺点 元服务&#xff08;Atomic Service&#xff09;含义用于干什么优缺点 鸿蒙应用与元服务的区别创建方法鸿蒙应用的创建元服务的创建 总结 随着科技的不断进步&#xff0c;操作系统也在不断迭代更新…

自用Proteus(8.15)常用元器件图示和功能介绍(持续更新...)

文章目录 一、 前言二、新建工程&#xff08;以51单片机流水灯为例&#xff09;2.1 打开软件2.2 建立新工程2.3 创建原理图2.4 不创建PCB布版设计2.5 创建成功2.6 添加元器件2.7 原理图放置完成2.8 编写程序&#xff0c;进行仿真2.9 仿真 三、常用元器件图示和功能介绍3.1 元件…

平安养老险深圳分公司积极开展“金融教育宣传月”活动,展现金融为民新风尚

2024年9月&#xff0c;平安养老险深圳分公司以“金融为民谱新篇&#xff0c;守护权益防风险”为主题&#xff0c;正式启动2024年“金融教育宣传月”活动&#xff0c;通过多样化开展进乡村、进商圈、进企业等宣传教育活动&#xff0c;将金融消保知识送达广大消费者身边&#xff…

【目标检测】常见机械零件数据集5900张5类VOC+YOLO

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;5913 标注数量(xml文件个数)&#xff1a;5913 标注数量(txt文件个数)&#xff1a;5913 标注…

Conda答疑

文章目录 优雅的使用Conda管理python环境1. conda info -e 和conda env list区别2.conda创建环境 创建的新环境在哪个文件夹下3. 自定义路径4. anaconda 新建环境 包是来自哪里4.1. 默认 Anaconda 仓库4.2. Conda-Forge4.3. 镜像源4.4. 自定义频道4.5. 总结 5. conda config --…

详解单流Transformer架构中图像/文本/表格/视频/音频经过transformer提取模态特征并生成令牌特征以及CLS到底是什么作用?

系列论文研读目录 文章目录 系列论文研读目录论文中经常出现的如下图中所示结果&#xff0c;其中到底做了什么&#xff1f;1、一张图片 经过self attention 和Feed forward 生成的是什么&#xff1f;具体流程如下&#xff1a;结果&#xff1a; 举个具体计算的例子假设条件1. 自…

番外篇 | CRAS-YOLO:基于卫星图像的多类别船舶检测和分类

前言:Hello大家好,我是小哥谈。目前,基于卫星图像的多类别船舶检测和分类由于在军事和民用领域的重要应用而备受关注。针对传统检测效果不佳的情形,我们进一步提出了一种新的多类船检测,称为CRAS-YOLO,它由卷积块注意力模块(CBAM)、感受野块(RFB)和基于YOLOv5s的自适…

python调用父类同名成员

语法 print(f"父类的厂商是&#xff1a;{Phone.producer}“) Phone.call_by_5g(self) print(f"父类的厂商是&#xff1a;{super().producer}”) print(f"父类的序列号是&#xff1a;{super().IMEI}") super().call_by_5g() print(“关闭CPU单核模式&…

产品经理内容分享(二):AI产品经理的入门路线图

引言 想象这样一个场景&#xff1a;早晨的阳光穿透窗帘&#xff0c;投射在新一代智能机器人上&#xff0c;它正静静等待着你的第一个命令开始全新的一天。这样的场景听起来像是科幻小说里的情节&#xff0c;但实际上&#xff0c;这正是AI产品经理们工作的成果。如果你对这样的…

超好用的element的el-pagination分页组件二次封装-附源码及讲解

前言&#xff1a;在很多后台管理系统开发时总会有很多分页组件的使用&#xff0c;如果我们每次都用elementui官网的el-pagination去写的话&#xff0c;调整所有分页的样式就会很麻烦&#xff0c;而且页面内容也会很累赘繁琐。 讲解一个我经常使用的二次封装el-pagination组件&…

c语言中,数组指针、指针数组、函数指针、指针函数

数组指针 直接理解为指向数组的指针&#xff0c;一般用于二位数组引用程序&#xff0c;形式如下 下面程序中用在二维数组中&#xff0c;把这个数组指针看作二维数组的第一维的指向&#xff1a; 用在一维数组中&#xff08;本质还是二维数组&#xff09;如下&#xff0c;类似…

JavaWeb——Vue组件库Element(3/6):常见组件:Dialog对话框、Form表单(介绍、使用、实际效果)

目录 Dialog对话框 介绍 使用 实际效果 Form表单 介绍 使用 实际效果 Dialog对话框 介绍 Dialog对话框&#xff1a;在保留当前页面状态的情况下&#xff0c;告知用户并承载相关操作。 Dialog 对话框组件可以在保留当前页面信息的状态下弹出一个对话框&#xff0c;并…