文章编号: 151585 - 最后修改: 2005年9月30日 - 修订: 3.0

如何使用 _crtBreakAlloc 调试内存分配

系统提示此文章适用于与您所使用的操作系统不同的操作系统。文章内容可能与您无关,并且已被禁用。
展开全部 | 关闭全部

概要

当向下跟踪内存泄漏使用 debug C 运行时 (CRT),通常是很有用的分配导致该泄漏的内存之前立即设置断点。通过设置 _crtBreakAlloc 在编译时或运行时您可能会导致用户定义的特定点的内存分配断点。

更多信息

跟踪内存泄漏与 _CrtDumpMemoryLeaks,如的调试 CRT 函数时将显示通常括在大括号 ({}) 中的分配编号。例如对于下面的示例是在分配编号为 18 的内存泄漏:
   Detected memory leaks!
   Dumping objects ->
   {18} normal block at 0x00660BE4, 10 bytes long
   Data: <          > CD CD CD CD CD CD CD CD CD CD
   Object dump complete.
					
它可用于之前获取分配此内存,因此可以单步执行调用堆栈,并查看有哪些函数正在导致获得分配此内存设置断点右。调试 CRT 函数 _CrtSetBreakAlloc,允许您指定的中断一个分配编号。此方法要求每次想要设置分配断点时重新编译您的程序。另一种方法是使用监视窗口,并动态地设置分配断点。此方法具有不需要任何源的代码更改或重新编译的优点。

如果静态链接到 C 运行时,要更改的变量称为 _crtBreakAlloc。如果要动态地链接到 C 运行时,该变量所需更改中,该窗口是的监视 {,msvcr40d.dll} * __p__crtBreakAlloc () ; 如果您使用的 Visual c + + 4.0 或 4.1。您想在更改该变量、 在监视窗口应该是 {、 msvcrtd.dll}*__p__crtBreakAlloc() 如果您使用的 Visual c + + 4.2 或更高版本。

若要确定使用的哪个版本的 CRT 都编译,请执行下列操作:
  1. 从生成菜单中选择设置。
  2. 在设置中为: 窗格中,选择要生成的配置。选择 C/c + + 选项卡,然后选择代码生成类别。
使用运行时库对话框应出现显示您正在使用的 CRT 的版本。(空白此设置时请确保您仅选择在设置的一种配置: 窗格)

要动态设置分配断点,请执行以下步骤:
  1. 启动调试会话。从生成菜单中选择调试-> 逐语句。如果您使用的"调试单线程"调试多的线程 CRT",请按照步骤 1a。否则,请按照步骤 1b。

    1. 在监视窗口中键入 _crtBreakAlloc。这将显示当前程序将停止运行的分配编号。此分配编号应为-1,第一次启动程序时。
    2. 类型 {、、 在监视窗口中如果您使用的 Visual c + + 4.0 或 4.1 msvcr40d.dll}*__p__crtBreakAlloc()。类型 {,,msvcrtd.dll}*__p__crtBreakAlloc() 如果您使用的 Visual c + + 4.2 或更高版本。这将显示当前程序将停止运行的分配编号。此分配编号应为-1,第一次启动程序时。
  2. 双击-1 值并输入新的分配编号,导致用户定义的断点。
  3. 从调试菜单中选择转到-> 的调试。
有关 _crtBreakAlloc 的详细信息,请参阅联机帮助中的"跟踪堆分配请求"。

这篇文章中的信息适用于:
  • The Integrated Debugger?当用于
    • Microsoft Visual C++ 4.0 标准版
    • Microsoft Visual C++ 4.1 Subscription
    • Microsoft Visual C++ 4.2 企业版
    • Microsoft Visual C++ 4.2 专业版
    • Microsoft Visual C++ 5.0 企业版
    • Microsoft Visual C++ 5.0 专业版
    • Microsoft Visual C++ 6.0 企业版
    • Microsoft Visual C++ 6.0 专业版
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
关键字:?
kbmt kbbug kbcrt kbdebug kbhowto kbide KB151585 KbMtzh
机器翻译机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 151585? (http://support.microsoft.com/kb/151585/en-us/ )
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。