如何调试MFC中的内存泄露

转载 2007年09月19日 17:04:00

阅读转贴文章前的预备知识:

VC++ IDE 的默认状态(VC6)是没有启用内存泄漏检测机制的,也就是说即使某段代码有内存泄漏,调试会话的 Output 窗口的 Debug 页不会输出有关内存泄漏信息。你必须设定以启用内存泄漏检测机制。

 
按下面的方法使用调试堆函数

在XXXView.cpp中添加下面粗体行

你再看看输出结果,是不是有很多的内存泄漏?

#define _CRTDBG_MAP_ALLOC 
#include<stdlib.h> 
#include<crtdbg.h> 

CXXXView::~CXXXView()
{
     _CrtDumpMemoryLeaks();
}

首先,应该是MFC报告我们发现内存泄漏。注意:要多运行几次,以确定输出的内容不变,特别是{}之间的数值,不能变,否则下面的方法就不好用了。

 

 

我们来看看:

F: CodeSample Test TestPipe LeakTest MainFrm.cpp(54) : {86} normal block at 0x00422E80, 10 bytes long.
Data: <          > 1F 1F 1F 1F 1F CD CD CD CD CD

F: CodeSample Test TestPipe LeakTest MainFrm.cpp(54) 告诉我们MFC认为是在该文件的54行,发生了内存泄漏。你双击改行就可以转到该文件的54行了。但是有时候这一信息并不能用来准确判断,比如:MFC可能报告Strcore.cpp文件的某行,实际上这是CString的实现函数,此时并不知道什么时候发生了内存泄漏。

此时我们需要更多的信息。那么我们看看紧接其后的:

{86} normal block at 0x00422E80, 10 bytes long.
Data: <          > 1F 1F 1F 1F 1F CD CD CD CD CD

它告诉我们:在第86次分配的内存没有释放,一共有10字节,内容移16进制方式打印给我们看。

有了这些信息,我们可以开始调试内存泄漏了。

按下F10在程序的刚开始处,停下来,打开Watch窗口:

 

 

在Watch窗口中输入:

{,,msvcrtd.dll}_crtBreakAlloc

 

然后更改值为上文提到的分配次数:86

 

 

接着按下F5继续,然后在第86次分配的时候会发生中断

 

 

然后我们打开堆栈窗口:

 

 

往回查看最近我们自己的代码,双击堆栈我们自己的函数那一层,上图有绿色三角的那一层。就定位到泄漏时分配的内存了。

 

 

之后,就是看你的编码功底了。

MFC ActiveX控件初步 调试方法

应用MFC向导生成ActiveX控件 第一步: 第二步:直接点击完成 第三步:可以再图中位置为ActiveX添加接口函数 第四步: 第五步:生成解决方案 第六步:本地调试 ...
  • Zhang_HZ2016
  • Zhang_HZ2016
  • 2016年10月26日 01:06
  • 518

在调试MFC程序中查看变量的方法(包含控制台)

在调试MFC程序时,我们经常需要查看特定位置变量的输出值。或者在某特定条件执行时,给出一个输出标识。 一般来说,有3种方法: 1)调用TRACE(LPCTSTR lpszFormat, ...)函...
  • zxccaoya
  • zxccaoya
  • 2016年11月07日 19:49
  • 2044

MFC学习——MFC工程在调试中查看输出信息

MFC工程在调试中查看输出信息
  • amusi1994
  • amusi1994
  • 2016年12月15日 21:27
  • 428

MFC 利用控制台输出调试信息(转)

转载的,出处不知道了。sorry 方法一: WINDOWS为你提供了一系列的API来完成这个功能,例如:ReadConsole,WriteConsole等,具体参见MSDN。 1。...
  • liuxizhen2009
  • liuxizhen2009
  • 2013年01月30日 22:39
  • 13636

Windows程序调试----第三部分 调试技术----第10章 调试多线程程序

第10章调试多线程程序     线程。当一个可怜的灵魂不得不在多线程环境中重现并诊断一个问题时,一个像线程这样优雅的结构所带来的痛苦之大是令人惊奇的。无论设计多么简单而直接,在程序中多引入仅仅一个线...
  • tiewen
  • tiewen
  • 2013年04月23日 14:25
  • 4706

MFC 调试方法

MFC 调试方法 Visual Studio 2013 其他版本 此主题尚未评级 - 评价此主题 如果要调试 MFC...
  • imxiangzi
  • imxiangzi
  • 2014年06月27日 10:31
  • 6283

MFC程序如何使用printf输出调试信息

设想一下,我们在win32控制台下写了个在命令行运行的程序库,图方便直接用printf输出log来进行调试,但后来集成库时使用了MFC之类的窗体程序,于是原先用printf输出的log信息都看不到了,...
  • xhhjin
  • xhhjin
  • 2015年12月14日 18:19
  • 8391

MFC串口调试工具教程

MFC串口调试软件教程 一、测试环境:Windows XP,VC++6.0 二、步骤 Step1:打开VC++6.0集成开发环境,新建基于对话框(Dialog based)的MFCAppWizard(...
  • trailbrazer
  • trailbrazer
  • 2016年05月18日 15:00
  • 3453

MFC中使用printf输出调试信息

MFC程序中要输出调试信息基本只能用edit空间显示内容。
  • u012564690
  • u012564690
  • 2014年05月10日 03:49
  • 3706

MFC/DLL 编程时用独立的控制台窗口显示用户自定义调试信息

###############DBWindow.h################## #ifndef _DBWINDOW_ #define _DBWINDOW_ #include //控制...
  • nokianasty
  • nokianasty
  • 2013年10月18日 11:53
  • 1000
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何调试MFC中的内存泄露
举报原因:
原因补充:

(最多只允许输入30个字)