【Visual Leak Detector】配置项 ReportEncoding

说明

使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇介绍 VLD 配置文件中配置项 ReportEncoding 的使用方法。 同系列文章目录可见 《内存泄漏检测工具》目录

1. 配置文件使用说明

在程序中通过 #include "vld.h" 的方式检测内存泄漏时,VLD 首先会尝试在程序的生成目录下读取 vld.ini 文件,若未读取成功,则会尝试在 VLD 的安装目录下读取 vld.ini 文件,若仍未读取成功,则会使用内置的默认配置,内置的默认配置如果不动源码是无法更改的,因此通过修改相应目录下的 vld.ini 文件来定制 VLD 功能是最好的选择。当配置参数等号右边为空,或者给配置了不合法值时,在使用过程中会被程序重置到默认值。

2. 设置输出报告的编码格式

参数名ReportEncoding

有效赋值asciiunicode

默认值ascii

功能说明:设置输出报告的编码格式。默认是 ascii 编码,若改为 unicode 编码,控制台输出报告的同时会自动将报告输出到文本文件中(即使没有人为设置输出到文件)。由于调试器 Debugger 是不支持 unicode 字符的,所以这个配置只对显示的内存数据形式有影响,当泄露块中包含 unicode 字符时,这个配置的效果才能体现。若项目路径中含有 unicode 字符,ascii 编码时将无法显示调用堆栈信息,改为 unicode 有时候则能正常显示,详见 StackOverflow vld displays empty call stack

2.1 测试代码

#include <QCoreApplication>
#include "vld.h"

void testFun()
{
    QString str = QStringLiteral("汉字unicode");
    char *ptr = new char[30]();
    QByteArray Block = str.toLocal8Bit();
    memcpy(ptr, Block.constData(), Block.size());
    printf("ptr = %08x, *ptr = %s.\n", ptr, ptr);
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    testFun();

    return a.exec();
}

测试环境:QT 5.9.2MSVC 2015 32bitDebug 模式,VLD 版本为 2.5.1,VLD 配置文件只对该参数做修改,测试工程所在路径为:E:\Cworkspace\Qt 5.9\QtDemo\testVLD

2.2 ReportEncoding = ascii 时的输出

标准输出窗显示:

ptr = 0119aa60, *ptr = 汉字unicode.

VLD 输出报告:

Visual Leak Detector read settings from: D:\Program Files (x86)\Visual Leak Detector\vld.ini
Visual Leak Detector Version 2.5.1 installed.
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 1 at 0x0119AA60: 30 bytes ----------
  Leak Hash: 0x7A25A79D, Count: 1, Total 30 bytes
  Call Stack (TID 2596):
    ucrtbased.dll!malloc()
    f:\dd\vctools\crt\vcstartup\src\heap\new_array.cpp (15): testVLD.exe!operator new[]() + 0x9 bytes
    e:\cworkspace\qt 5.9\qtdemo\testvld\main.cpp (7): testVLD.exe!testFun() + 0x10 bytes
    e:\cworkspace\qt 5.9\qtdemo\testvld\main.cpp (19): testVLD.exe!main()
    f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (74): testVLD.exe!invoke_main() + 0x1B bytes
    f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (264): testVLD.exe!__scrt_common_main_seh() + 0x5 bytes
    f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (309): testVLD.exe!__scrt_common_main()
    f:\dd\vctools\crt\vcstartup\src\startup\exe_main.cpp (17): testVLD.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x19 bytes
    ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0x11E bytes
    ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xEE bytes
  Data:
    BA BA D7 D6    75 6E 69 63    6F 64 65 00    00 00 00 00     ....unic ode.....
    00 00 00 00    00 00 00 00    00 00 00 00    00 00           ........ ........


Visual Leak Detector detected 1 memory leak (66 bytes).
Largest number used: 66 bytes.
Total allocations: 66 bytes.
Visual Leak Detector is now exiting.

2.3 ReportEncoding = unicode 时的输出

标准输出窗显示:

ptr = 0141bbe8, *ptr = 汉字unicode.

VLD 输出报告(控制台):

Visual Leak Detector read settings from: D:\Program Files (x86)\Visual Leak Detector\vld.ini
Visual Leak Detector Version 2.5.1 installed.
NOTE: Visual Leak Detector: Unicode-encoded reporting has been enabled, but the
  debugger is the only selected report destination. The debugger cannot display
  Unicode characters, so the report will also be sent to a file. If no file has
  been specified, the default file name is ".\memory_leak_report.txt".
    Generating a Unicode (UTF-16) encoded report.
    Outputting the report to the debugger and to E:\Cworkspace\Qt 5.9\QtDemo\build-testVLD-Desktop_Qt_5_9_2_MSVC2015_32bit-Debug\memory_leak_report.txt
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 1 at 0x0141BBE8: 30 bytes ----------
  Leak Hash: 0x7A25A79D, Count: 1, Total 30 bytes
  Call Stack (TID 20200):
    ucrtbased.dll!malloc()
    f:\dd\vctools\crt\vcstartup\src\heap\new_array.cpp (15): testVLD.exe!operator new[]() + 0x9 bytes
    e:\cworkspace\qt 5.9\qtdemo\testvld\main.cpp (7): testVLD.exe!testFun() + 0x10 bytes
    e:\cworkspace\qt 5.9\qtdemo\testvld\main.cpp (19): testVLD.exe!main()
    f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (74): testVLD.exe!invoke_main() + 0x1B bytes
    f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (264): testVLD.exe!__scrt_common_main_seh() + 0x5 bytes
    f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (309): testVLD.exe!__scrt_common_main()
    f:\dd\vctools\crt\vcstartup\src\startup\exe_main.cpp (17): testVLD.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x19 bytes
    ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0x11E bytes
    ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xEE bytes
  Data:
    BA BA D7 D6    75 6E 69 63    6F 64 65 00    00 00 00 00     ??湵捩摯e..
    00 00 00 00    00 00 00 00    00 00 00 00    00 00           ........


Visual Leak Detector detected 1 memory leak (66 bytes).
Largest number used: 66 bytes.
Total allocations: 66 bytes.
Visual Leak Detector is now exiting.

VLD 输出报告(文件 memory_leak_report.txt):

Visual Leak Detector Version 2.5.1 installed.
NOTE: Visual Leak Detector: Unicode-encoded reporting has been enabled, but the
  debugger is the only selected report destination. The debugger cannot display
  Unicode characters, so the report will also be sent to a file. If no file has
  been specified, the default file name is ".\memory_leak_report.txt".
    Generating a Unicode (UTF-16) encoded report.
    Outputting the report to the debugger and to E:\Cworkspace\Qt 5.9\QtDemo\build-testVLD-Desktop_Qt_5_9_2_MSVC2015_32bit-Debug\memory_leak_report.txt
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 1 at 0x0141BBE8: 30 bytes ----------
  Leak Hash: 0x7A25A79D, Count: 1, Total 30 bytes
  Call Stack (TID 20200):
    ucrtbased.dll!malloc()
    f:\dd\vctools\crt\vcstartup\src\heap\new_array.cpp (15): testVLD.exe!operator new[]() + 0x9 bytes
    e:\cworkspace\qt 5.9\qtdemo\testvld\main.cpp (7): testVLD.exe!testFun() + 0x10 bytes
    e:\cworkspace\qt 5.9\qtdemo\testvld\main.cpp (19): testVLD.exe!main()
    f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (74): testVLD.exe!invoke_main() + 0x1B bytes
    f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (264): testVLD.exe!__scrt_common_main_seh() + 0x5 bytes
    f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (309): testVLD.exe!__scrt_common_main()
    f:\dd\vctools\crt\vcstartup\src\startup\exe_main.cpp (17): testVLD.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x19 bytes
    ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0x11E bytes
    ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xEE bytes
  Data:
    BA BA D7 D6    75 6E 69 63    6F 64 65 00    00 00 00 00     몺훗湵捩摯e..
    00 00 00 00    00 00 00 00    00 00 00 00    00 00           ........


Visual Leak Detector detected 1 memory leak (66 bytes).
Largest number used: 66 bytes.
Total allocations: 66 bytes.
Visual Leak Detector is now exiting.

2.4 输出结果对比

  • ReportEncoding = ascii 时,泄漏内存中的数据(汉字unicode)只有 unicode 显示正确,根据句点 . 的个数可知一行显示 16 个 ascii 字符。
  • ReportEncoding = unicode 时,报告会同时输出到生成目录下,默认文件名为 memory_leak_report.txt,根据句点 . 的个数可知一行显示 8 个 unicode 字符。奇怪的是,不论是在控制台中还是在文件中,泄漏内存中的汉字并没有按期望正常显示,只有最后一个字母 e 显示正确,这一现象产生的原因还未找到。对比控制台输出与文件输出,文件输出少了第一行 Visual Leak Detector read settings from: D:\Program Files (x86)\Visual Leak Detector\vld.ini,泄漏数据的显示也略有差别,其他部分两者完全保持一致。

原文链接:https://www.cnblogs.com/young520/p/17263190.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:【Visual Leak Detector】配置项 ReportEncoding - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • 【Visual Leak Detector】核心源码剖析(VLD 2.5.1)

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇对 VLD 2.5.1 源码做内存泄漏检测的思路进行剖析。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 源码获取 2. 源码文件概览 3. 源码剖析 3.1 通过 inline hook 修补 LdrpCallInitRoutine 3.2 通过 IAT hook 替换内存操…

    C++ 2023年5月11日
    00
  • 【Visual Leak Detector】配置项 SkipCrtStartupLeaks

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇介绍 VLD 配置文件中配置项 SkipCrtStartupLeaks 的使用方法。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 配置文件使用说明 2. 设置是否忽略启动代码引起的内存泄漏 1. 配置文件使用说明 在程序中通过 #include “vld.h” 的方式检测内存…

    C++ 2023年4月18日
    00
  • 【Visual Leak Detector】配置项 StartDisabled

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇介绍 VLD 配置文件中配置项 StartDisabled 的使用方法。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 配置文件使用说明 2. 设置是否禁用自动初始化 2.1 测试代码 2.2 StartDisabled = no 时的输出 2.3 StartDisabled …

    C++ 2023年4月18日
    00
  • C++ 学习笔记

    堆,栈,RAII 堆:分配内存之后需要手动释放,否则,将要造成内存泄漏 new和delete操作的是free store malloc和free操作的是heap new的底层就是malloc 动态获取内存都是在堆中进行的auto ptr = new std::vector<int>() 智能指针 unique_ptr 独享它所指向的指针,也就是说…

    C++ 2023年4月18日
    00
  • 前缀和

    前缀和 一、介绍 前缀,顾名思义就是一个东西前面的点缀…(bushi 其实打比方来说就是:假如有一字符串ABCD,那么他的前缀就是A、AB、ABC、ABCD这四个从新从第一个字母一次往后开始拼接的字符串。当然这是字符串。但前缀和一般应用于数组,对于给定的数组a=[1,2,3,4],他的前 i 项和sum[i]就表示数组中a[0]~a[i]的和,具体为:s…

    C++ 2023年5月3日
    00
  • Qt-FFmpeg开发-视频播放(5)

    音视频/FFmpeg #Qt Qt-FFmpeg开发-视频播放【软/硬解码 + OpenGL显示YUV/NV12】 目录 音视频/FFmpeg #Qt Qt-FFmpeg开发-视频播放【软/硬解码 + OpenGL显示YUV/NV12】 1、概述 2、实现效果 3、FFmpeg硬解码流程 4、优化av_hwframe_transfer_data()性能低问题…

    C++ 2023年4月17日
    00
  • XMake学习笔记(1):Windows(MSYS2)下MinGW-w64环境搭建和XMake安装

    以前写的C++基本都是C with STL,大多是面向过程的算法题,或者比较小的项目,然后经常报各种编译错误(对编译原理不熟),经常把人搞到崩溃,搞不懂构建、链接之类的东西。 现在开始记录一下XMake的学习笔记,记录一些学习过程中踩的坑,在这篇文章,你将学习到Windows下利用MSYS2进行Mingw-w64环境搭建和XMake安装,并用Xmake构建一…

    C++ 2023年4月30日
    00
  • <五>move移动语义和forward类型转发

    move : 移动语义,得到右值类型forward:类型转发,能够识别左值和右值类型 只有两种形式的引用,左值引用和右值引用,万能引用不是一种引用类型,它存在于模板的引用折叠情况,但是能够接受左值和右值区分左值和右值得一个简单方式就是能不能取地址一个右值一旦有名字那么就变成了左值 #include <iostream> using namespa…

    C++ 2023年5月4日
    00
合作推广
合作推广
分享本页
返回顶部