再谈C++内存泄漏追踪方法

C++内存泄漏,引起的原因有许多,不同的平台,所引起的原因也有差别,重点是如何追踪到内存泄漏所在的代码行,因为只要找到了问题,解决掉往往比泄漏定位要简单的多。

总结一下,定 位泄漏所在位置,哪个类,哪一行,主要用到两种方法:

Windebug 和VLD,两种方法各有各的优势,这里重点记述两者的操作方法:

  其一:WIndebug 寻找法,

  准备环境:安装Win10SDK,记得要启用WinDebugTools功能(在控制面板--》程序中修改,启用

Debugging Tools for Windows 功能

第二步,将Debug目录添加至环境变量中

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64   //默认安装一般是这个目录,除非你更改了哦

第三步:配置批处理,设置程序目录,

@ECHO OFF

@REM 程序目录
SET APPDIR="D:\work_cpp\work_projects\MemDebug\x64\Debug"

@REM 软件名
SET APPNAME="MemDebug.exe"

@REM WinDbg目录
SET UMDH="C:\Program Files (x86)\Windows Kits\10\Debuggers\x64"

@REM 符号目录
SET SYMBOLS=""

SET _NT_SYMBOL_PATH=%APPDIR%;%SYMBOLS%;SRVd:\SymbolCachehttp://msdl.microsoft.com/download/symbols
SET PATH=%UMDH%;%PATH%

@REM 执行清理
DEL log.txt
DEL log1.txt
DEL log2.txt

@REM 开启用户堆
@REM gflags.exe /i %APPNAME% +ust

SET /P PID=[STEP1]请将目标程序启动并输入进程ID: 

ECHO [STEP2]按下任意键开始第一次捕获
PAUSE
umdh.exe -p:%PID% -f:log1.txt

ECHO [STEP3]按下任意键开始第二次捕获
PAUSE
umdh.exe -p:%PID% -f:log2.txt

@REM 关闭用户堆
@REM gflags.exe /i %APPNAME% +ust

ECHO [STEP4]正在生成报表
umdh.exe log1.txt log2.txt  -f:log.txt
notepad.exe log.txt

PAUSE

第四步,先后启动批处理和要跟踪的程序,输入程序的PID,(根据控制台窗口操作),

连续触发两次,就会抓取到内存泄漏所在的行

其二便是VLD 跟踪法,只有在开着编译器运程序,然后关闭程序的时候就会给出内存泄漏所在的行以及函数

 关于VLD跟踪法,网上的教程很多,这里只记述一些注意的问题:

  1:程序发布只能是以Debug模式进行,并且要带上dbghel.dll, vld_x64.dll,以及:

Microsoft.DTfW.DHL.manifest三个文件,放在exe同级目录下才有效果(Release模式试了跟踪不到)

2:VLD头文件必须放在第一行引用;

3:VLD的Debug库有两种MFC和QT,要注意不同的平台使用不同的库;

WinDBG 是个非常强大的调试器,它设计了极其丰富的功能来支持各种调试任务,包括用户 态调试、 内核态调试、 调试转储文件、 远程调试等等。 WinDBG 具有非常大的灵活性和可扩展性, 用来满足各种各样的调试需求,比如用户可以自由定义调试事件的处理方式,编写调试扩展模块 来定制和补充 WinDBG 的调试功能。 尽管 WinDBG 是个典型的窗口程序, 但是它的大多数调试功能还是以手工输入命令的方式来 工作的。目前版本的 WinDBG 共提供了 20 多条标准命令, 140 多条元命令( Meta-commands), 和难以计数的大量扩展命令。学习和灵活使用这些命令是学习 WinDBG 的关键,也是难点。 上一章我们从设计的角度分析了 WinDBG ,本章将从使用(用户)的角度介绍 WinDBG 。我 们先介绍工作空间的概念和用法(第 1 节),然后介绍命令的分类和不同种类的命令提示符(第 2 节)。 第 3 节介绍不同的调试模式, 也就是如何与不同特征的调试目标建立调试会话。 第 4 节介绍 上下文的概念和在调试时应该如何切换和控制上下文。第 5 节介绍调试事件和如何定制调试事件 的处理方式。 从第 6 节到第 9 节我们将分别介绍如何在 WinDBG 中完成典型的调试操作, 比如控 制调试目标(第 6 节)、设置断点(第 7 节)、观察栈(第 8 节)以及如何观察和修改数据(第 9 节)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海木漄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值