8000 【不敢说一文搞懂】VLD 内存泄漏定位 · Issue #137 · holdyounger/ScopeBlog · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
【不敢说一文搞懂】VLD 内存泄漏定位 #137
Open
@holdyounger

Description

@holdyounger

【不敢说一文搞懂】VLD 内存泄漏定位

[toc]

半学半练,定位了一把内存泄漏的问题。

内存泄漏工具的想必大家都知道了,主要使用 VLD 这个工具。

VLD 下载安装和使用

1. 下载和安装

Visual Leak Detector | Enhanced Memory Leak Detection for Visual C++

点击上方链接下载和安装 vld 工具,记住安装的位置,后续有很多文件会使用到,需要拷贝移动到相应的文件中。

2. 使用

  1. 安装完成后,找到安装所在的文件夹
  2. 找到 vs studio 中 <mark>标准头文文件</mark> 所在的文件夹,一般会在对应的 windows kits 所在的文件夹中找到。如: C:&#92;Program Files (x86)&#92;Windows Kits&#92;10&#92;Include&#92;10.0.18362.0&#92;ucrt。拷贝安装目录下 include 中的 头文件到该目录,注意有几个 kits 环境就尽量拷贝几个,万一用到呢
  3. 找到 vs studio 中 <mark>库文件</mark> 所在的文件夹,一般会在对应的 windows kits 所在的文件夹中找到。如: C:&#92;Program Files (x86)&#92;Windows Kits&#92;10&#92;Lib&#92;(kits 版本号)&#92;um&#92;。拷贝安装目录下 lib 目录下对应位数的 lib 文件到 kits 对应的 um&#92;x64um&#92;x86 文件夹中。

image-20220913162958861

到这一步,只要在程序中引入 vld 头文件就可以正常使用了。

#include &lt;vld.h&gt;

3. 在 vs2015 以上的版本中使用

> 安装的时候就可以看到 vld 只支持到 vs2015。所以在 vs 更高的版本中使用时,需要一些额外的操作。
>
> 影响:在vs高版本中使用时,虽然能定位泄漏问题,但是不显示文件名和行号。

解决办法:

在 vs 工程设置中按下图设置:

vs-vld-config

4. release 模式下进行内存泄漏检测

在 Debug 模式下,直接在工程中源文件中任意位置引入 &lt;vld.h&gt; 即可,编译之后的可执行文件就带有泄漏检测的功能。

但是在 Release 模式下则需要做一下额外的处理。

  1. 同 Debug 版本在 VS 中一样配置好 VLD 的相关信息

  2. 拷贝 VLD 安装目录下 bin&#92;win32 目录下所有的文件和 vld.ini 到工程目标路径下(可执行文件的目录)。

  3. 在程序入口处的 cpp 文件中,定义强制检测宏和包含 vld 头文件

    #define VLD_FORCE_ENABLE
    #include &lt;vld.h&gt;
  4. 在程序启动和退出时,分别增加以下函数调用

    {
        ...
        VLDGlobalEnable();
        VLDReportLeaks();
        //some code...
        VLDGlobalDisable();
    }
  5. 增加检测模块(如加载的 dll 文件)

    > 以上配置后,默认情况下只会检测主线程的模块,要想增加其他模块的内存泄漏检测,需要配置 vld.ini 配置文件中的 ForceIncludeModules 配置项。在该配置项后增加需要检测的模块。如:ForceIncludeModules=demo1.dll;demo2.dll

  6. 配置输出方式

    同样还是配置文件中修改。设置配置文件中 ReportTo 的值即可:

    • debugger:控制台
    • file: 文件 (默认会输出在运行程序的目录下,也可能会输出在 syswow64 这个系统目录下,<kbd>Win+R</kbd> 输入 syswow64即可打开这个目录。默认文件名:memory_leak_report.txt
    • both:控制台和文件

    > 关于 VLD 的配置文件:
    >
    > Vld 的库会检查程序所运行的当前目录是否存在 vld.ini 的配置文件,如果有,则加载里头的配置进行内存检测运行,如果没有取默认的配置参数运行,我们可以手动将 vld.ini 的文件拷贝到程序的运行目录中即可。
    >
    > 关于 vld.ini 的几个注意的参数:
    >
    > 1. VLD = on 总开关,是否启用 VLD 功能,默认为 yes
    > 2. MaxDataDump = 256 用来显示检测到的内在泄露的块的地址大小,默认256,其实就是显示多少个byte的内容。
    > 3. MaxTraceFrames = 64 设置 VLD 检测到堆栈的最大层极,也就是frame的深度
    > 4. ReportFile = xxx设置 VLD 生成报告的位置和报告的文件名,默认为:.&#92;memory_leak_report.txt ,程序当前运行目录中。
    > 5. ReportTo = debugger 设置 VLD 生成报告的方式,debugger为在控制台输出 VLD 的报告信息,file在指定目录下生成报告文件,both为即输出也生成报告。如果你的程序为带窗体的程序,需要设置为file或both.

问题1:不显示文件名和行号

缺少 pdb 文件

如果程序运行之后生成的 memory_leak_report 中还是不显示行号,则试试把pdb文件放在程序的运行目录试试。

参考文章

  1. 【VS2019】C/C++内存泄漏检测工具:Visual Leak Detector超详细安装教程(for windows)_执行x的博客-CSDN博客_vs2019内存泄漏检测

  2. 使用VLD进行内存泄漏检测(release + debug)_OH,CGWLMXUP的博客-CSDN博客_release vld

blog link 【不敢说一文搞懂】VLD 内存泄漏定位

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0