通过


使用_crtBreakAlloc调试内存分配

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

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

总结

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

详细信息

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

检测到内存泄漏!
转储对象 ->
{18} 正常块,长度为 10 字节,0x00660BE4
数据: <> CD CD CD
对象转储完成。

在分配此内存之前设置断点非常有用,以便可以单步执行调用堆栈并查看导致此内存分配的函数。 使用 Debug-CRT 函数 _CrtSetBreakAlloc 可以指定要中断的分配号。 此方法要求每次要设置分配断点时重新编译程序。 另一种方法是使用“监视”窗口并动态设置分配断点。 此方法的优点是不需要任何源代码更改或重新编译。

如果要静态链接到 C 运行时,将调用 _crtBreakAlloc要更改的变量。 如果要动态链接到 C 运行时,则要在“监视”窗口中更改的变量是 {,,msvcr40d.dll}__p__crtBreakAlloc() ,如果使用 Visual C++ 4.0 或 4.1。 如果要使用 Visual C++ 4.2 或更高版本,则应 {,,msvcrtd.dll}__p__crtBreakAlloc() 在“监视”窗口中更改的变量。

若要确定要编译的 CRT 版本,请使用:

  1. 在“生成”菜单中,选择“设置”。

  2. “设置 ”窗格中,选择要为其构建的配置。 选择 “C/C++ ”选项卡,然后选择“ 代码生成 ”类别。

“使用运行时库”对话框应显示正在使用的 CRT 版本。 (如果此设置为空,请确保仅在“设置”窗格中选择了一个配置。

若要动态设置分配断点,请执行以下步骤:

  1. 启动调试会话。 在“生成”菜单中,选择“调试 -> 单步执行”。 如果使用“调试单线程”或“调试多线程 CRT”,请按照步骤 1a 操作。 否则,请遵循步骤 1b。

    1. 在“监视”窗口中键入 _crtBreakAlloc 。 这会显示程序将停止的当前分配编号。 当程序首次启动时,此分配编号应为 -1。

    2. 如果使用 Visual C++ 4.0 或 4.1,请在“监视”窗口中键入 {,msvcr40d.dll} __p__crtBreakAlloc()。 如果使用 Visual C++ 4.2 或更高版本,请键入 {,msvcrtd.dll}__p__crtBreakAlloc( )。 这会显示程序将停止的当前分配编号。 当程序首次启动时,此分配编号应为 -1。

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

  3. 在“调试”菜单中,选择“调试->Go”。

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