如何:在内存分配编号上设置断点

如何:在内存分配编号上设置断点

 

本主题适用于:

Visual Studio 版本

Visual Basic

C#

C++

J#

速成版

本机

标准版

本机

专业团队版

本机

Note 注意

显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您的当前设置或版本。若要更改设置,请在“工具”菜单上选择“导入和导出设置”。有关更多信息,请参见 Visual Studio 设置

内 存泄漏报告中的文件名和行号告诉您分配泄漏内存的位置,但知道分配内存的位置并不总是足以确定问题。程序运行期间经常会多次调用某分配,但该分配可能只在 某些调用中泄漏内存。若要确定问题,不仅需要知道分配泄漏内存的位置,还需要知道泄漏发生的条件。使您能够实现这一点的信息是内存分配编号。显示时,出现 在文件名和行号后面大括号中的编号即是内存分配编号。例如,在下面的输出中,内存分配编号为 18。这意味着泄漏的内存是在程序中分配的第 18 个内存块。

Detected memory leaks!
Dumping objects ->
C:/PROGRAM FILES/VISUAL STUDIO/MyProjects/leaktest/leaktest.cpp(20) : {18}
normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

CRT 库对程序运行期间分配的所有内存块进行计数,包括由 CRT 库本身分配的内存和其他库(如 MFC)分配的内存。因此,分配编号为 N 的对象将为程序中分配的第 N 个对象,但可能不是代码分配的第 N 个对象。(大多数情况下并非如此。)

可以使用分配编号在分配内存的位置设置一个断点。方法是在程序起始附近设置一个位置断点。当程序在该点中断时,可以从“快速监视”对话框或“监视”窗口设置一个内存分配断点。

过程

在“监视”窗口中设置内存分配断点

  1. 在“监视”窗口的“名称”栏中键入以下表达式:

    _crtBreakAlloc

    如果要使用 CRT 库的多线程 DLL 版本(/MD 选项),请加入上下文运算符,如下所示:

    {,,msvcr71d.dll}_crtBreakAlloc
  2. 按 Return。

    调试器将计算调用,并将结果放入“值”列。如果没有在内存分配上设置任何断点,该值将为 –1。

  3. 用要在其位置中断的内存分配的分配编号替换“值”列中的值。例如,使用 18 以在上面输出中所示的分配处中断。

在 所感兴趣的内存分配上设置了断点后,可以继续调试。注意在与以前运行相同的条件下运行程序,以便分配顺序不会更改。当程序在指定的内存分配处中断时,可以 查看“调用堆栈”窗口和其他调试器信息以确定分配内存时的情况。如果必要,可以从该点继续执行程序,以查看对象发生了什么情况,或许可以确定未正确释放对 象的原因。

Note 注意

在对象上设置数据断点可能很有用。有关更多信息,请参见如何:设置数据断点(仅限本机)

尽管通常在调试器中设置内存分配断点更方便,但如果愿意,也可在代码中设置这些断点。

在代码中设置内存分配断点

  • 添加如下一行(对于第 18 个内存分配):

    _crtBreakAlloc = 18;

或者,可以使用 _CrtSetBreakAlloc 函数,它具有相同的效果:

_CrtSetBreakAlloc(18);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值