使用 _crtBreakAlloc 调试内存分配

本文介绍如何使用 _crtBreakAlloc 调试内存分配。

原始产品版本:   Visual c + +
原始 KB 数:   151585

摘要

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

更多信息

使用 Debug-CRT 函数(例如 _CrtDumpMemoryLeaks ,括在大括号 () 中的分配号)跟踪内存泄漏时, {} 通常会出现此情况。 例如,以下是分配号18处的内存泄漏:

检测到的内存泄漏!
转储对象->
{18} 0x00660BE4 处的正常块,长10个字节
Data: < > CD cd cd cd cd cd cd cd cd cd cd
对象转储已完成。

在分配内存之前设置一个断点很有用,这样您就可以逐步完成调用堆栈,并查看哪些函数导致内存被分配。 _CrtSetBreakAlloc使您可以指定要断开的分配号的调试 CRT 函数。 此方法要求您在每次想要设置分配断点时重新编译您的程序。 另一种方法是使用 "监视" 窗口并动态设置分配断点。 此方法的优点是不需要更改或重新编译任何源代码。

如果您静态链接到 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 ( # B1 。 如果使用的是 Visual c + + 4.2 或更高版本,请键入 {,,msvcrtd.dll} __p__crtBreakAlloc ( # B1 。 这将显示您的程序将在其处停止的当前分配编号。 当您的程序首次启动时,此分配号应为-1。

  2. 双击 -1 值,并输入导致用户定义断点的新分配编号。

  3. 从 " 调试 " 菜单中选择 " 调试 " " -> 转到 "。

有关的详细信息 _crtBreakAlloc ,请参阅联机帮助中的 跟踪堆分配请求