在vc2008中用_crtBreakAlloc调试内存泄漏 2012-07-27 16:58:25

分类: C/C++

这两天调一个程序,发现每次退出都有内存泄漏,在此总结一个调试内存泄漏的好方法。

对于比较明显的内存泄漏,vc2008是比较容易定位的,在Debug模式F5运行,退出时会列出引起内存泄漏的问题代码所在文件及行号;但如果是比较隐蔽的内存泄漏,Output输出窗口只会输出部分信息,形式如下:

Detected memory leaks!
    Dumping objects ->
    {858} normal block at 0x003ED290, 12 bytes long.
    Data: < H         > A0 5C 48 00 00 00 00 00 00 00 00 00
    Object dump complete.

我们来看一下输出信息的格式。

{xxx} — 表示程序运行后第xxx次内存分配发生了泄漏,即内存分配编号;

xxx block — 表示内存块类型,包括三种:普通(normal)、客户端(client)和运行时(CRT);

at 0xFFFFFFFF — 表示发生泄漏的内存地址,用十六进制表示;

xx bytes long — 表示发生泄漏的内存大小;

Data:xxx — 表示内存数据信息,一般输出前16字节的内容。

内存泄漏的地址、大小和数据信息很难对我们的定位起到有效地帮助,但是如果我们能够让程序停在分配有泄漏的内存的地方,然后根据调用堆栈(Call Stack)里的信息,就可以很方便的定位是哪个语句出现问题。幸运的是,VC的C运行库(C run-time library)为我们提供了一个这样的函数:CrtSetBreakAlloc,声明如下:

long _CrtSetBreakAlloc( long lBreakAlloc );

其中参数lBreakAlloc即为内存分配号(花括号中的数字)。我们只要在程序初始化函数中添加语句:_CrtSetBreakAlloc(858)就可以使程序在Debug F5运行时自动断点到我们想要的位置。

使用这个函数进行内存泄漏定位有个条件,即发生内存泄漏的分配号是固定的,每次启动程序不会随机变化。

但是如果我们的程序比较大,内存泄漏也不止一个,用上面的方法调试可能会很麻烦,需要经常更新代码并重新编译程序。还有更好的方法。

首先确定自己的程序使用的是哪个C运行库,方法是程序Propertise -> C/C++ -> Code Generation -> Runtime Library选项,若为Multi-threaded Debug(/MTd),则为静态链接,若为Multi-threaded Debug DLL(/MDd),则为动态链接。

然后按F11启动程序,程序会停在入口点。此时调出Watch窗口,

静态链接 在name项中输入_crtBreakAlloc,在value项中输入你要定位的内存分配编号;

动态链接 在name项中输入{,,msvcr90d.dll}_crtBreakAlloc,在value项中输入内存分配号。注意msvcr90d.dll是vc2008环境使用的运行库dll,若你用的是其他版本vc,请换成对应版本的dll。

现在按F5运行,程序就会自动定位到你要调试的内存分配语句,这时候看call stack的信息会很有帮助。

这个办法使用起来非常灵活,只要你确定内存分配号是不变的,就可以方便地为程序设置断点了,省去了更新代码和编译的麻烦。这个方法几乎是当前进行内存泄漏调试的最有效方法,如果你发现内存泄漏的分配号是变化的,可以想办法去掉一些没有问题的内存申请(多半是界面和多线程涉及到的申请),尽量使有问题的分配固定,就可以用这个方法排错了。

在vc2008中用_crtBreakAlloc调试内存泄漏相关推荐

  1. Golang程序调试 -- 内存泄漏pprof工具

    Golang程序调试 -- 内存泄漏pprof工具 代码引入pprof WEB访问模式 命令行模式定位内存 命令行模式定位耗时 命令行模式定位内存分配 代码引入pprof import (" ...

  2. linux踩内存内存越界,Linux如何调试内存泄漏?超牛干货奉献给你(代码全)

    内存泄漏是指由于疏忽或错误造成程序未能释放已经不再使用的内存.内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存 ...

  3. Windbg 调试内存泄漏

    第一步:简单配置 在windbg程序目录下有个gflags.exe,运行后设置: 运行CMD.EXE,输入 "D:\Debugging Tools for Windows (x86)\gfl ...

  4. Visual Studio中检测内存泄漏的方法(一)

    有些内存泄露是不会dump出来详细信息的,只会给出内存块号,这种情况一下一般可以用一下方法调试出来. 这两天调一个程序,发现每次退出都有内存泄漏,在此总结一个调试内存泄漏的好方法. 对于比较明显的内存 ...

  5. 介绍两个非常好用的Javascript内存泄漏检测工具

    内存泄漏对开发者来说一般很难检测因为它们是由一些大量代码中的意外的错误引起的,但它在系统内存不足前并不影响程序的功能.这就是为什么会有人在很长时间的测试期中收集应用程序性能指标来测试性能. 最简单的检 ...

  6. js内存泄露 垃圾回收_Java内存体系结构(模型),垃圾回收和内存泄漏

    js内存泄露 垃圾回收 Java内存架构(Java内存模型) 上面是堆的Java内存模型以及Java虚拟机(JVM)中运行的任何Java应用程序的PermGen. 还提供了比率,以使您更好地了解如何在 ...

  7. Java内存体系结构(模型),垃圾回收和内存泄漏

    Java内存架构(Java内存模型) 上面是堆的Java内存模型以及Java虚拟机(JVM)中运行的任何Java应用程序的PermGen. 还提供了比率,以使您更好地了解如何在每种世代类型之间分配允许 ...

  8. VC使用CRT调试功能来检测内存泄漏

    信息来源:csdn      C/C++ 编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:"最大的长处也可能成为最大的弱点",那么 C/C++ 应用程序正好印证 ...

  9. VC使用CRT调试功能检测内存泄漏(转载)

    /*********************************************************************************** 检测内存泄漏的基本工具是调试器 ...

最新文章

  1. QSignalMapper的使用
  2. 提权函数之RtlAdjustPrivilege()
  3. 洛谷——P1012 拼数
  4. gdb命令中attach使用
  5. 剑指offer--打印1到最大的n位数
  6. mysql-数据库的设计三范示与ER模型
  7. 基于卷积神经网络的图像情感分析模型,Python实现
  8. aws终止实例后还收费吗_「技术选型」AWS 和 AZURE的全面比较
  9. 5.3使用自定议的测试数据库文件
  10. Linux系统提高编辑效率的vim工具重要知识
  11. MySQL的show global variables like “%timeout%“;
  12. matlab 非线性系统仿真,非线性控制系统毕业论文--基于Matlab的非线性系统控制仿真研究...
  13. 单阶段和两阶段目标检测
  14. 智慧树python数据分析与数据可视化_智慧树知到Python数据分析与数据可视化答案免费查询...
  15. PMP 考试应试技巧二十五条
  16. DevOps工程师主要负责哪些事?需要具备哪些技能?
  17. 简单图片自动手动播放html,js手动播放图片实现图片轮播效果
  18. C语言中access函数
  19. 汇编语言-jcxz指令
  20. 纯HTML+JS实现跑酷游戏

热门文章

  1. Java公式编辑器开发思路,附项目源码
  2. 开源电子表格Luckysheet强势推出在线协作
  3. 扩展了 jquery 的插件 easy drag (转载 木野狐)
  4. oscp——five86: 2
  5. 国际宏观变化20221204
  6. aws云服务器会自动扣费吗,AWS云服务免费套餐竟然扣钱了?可能是因为你的region没管好...
  7. 台式计算机风扇为什么光散热,电脑噪音太大了,要如何降噪?其实不光是风扇的事!...
  8. Security2:角色和权限
  9. 企业IT咨询和信息化规划方法
  10. 今日分享-ios蓝牙