调试例程
C 运行时库的调试版本提供了很多诊断服务,便于调试程序并允许开发人员执行以下操作:
在调试期间直接执行运行时函数
解决断言、错误和异常
跟踪堆分配,并防止出现内存泄漏
向用户报告调试消息
C 运行时库例程的调试版本
若要使用这些例程,必须定义 _DEBUG
标志。 所有这些例程在零售版本的应用程序中不执行任何操作。 若要详细了解如何使用新的调试例息,请参阅 CRT 调试技术。
例程 | 使用 |
---|---|
_ASSERT |
计算表达式,并在结果是 FALSE 时生成调试报告 |
_ASSERTE |
类似于 _ASSERT ,但包括生成报告中的失败表达式 |
_CrtCheckMemory |
确认在调试堆上分配的内存块的完整性 |
_CrtDbgBreak |
设置一个断点。 |
%> | 生成具有用户消息的调试报表并将此报表发送到三个可能的目标 |
_CrtDoForAllClientObjects |
为堆中的所有 _CLIENT_BLOCK 类型调用应用程序提供的函数 |
_CrtDumpMemoryLeaks |
发生了大量内存泄漏时转储调试堆上的所有内存块 |
_CrtIsMemoryBlock |
确认指定的内存块位于本地堆,并且具有有效的调试堆块类型标识符 |
_CrtIsValidHeapPointer |
验证指定的指针是否位于本地堆中 |
_CrtIsValidPointer |
验证指定的内存范围对于读取和写入是否有效 |
_CrtMemCheckpoint |
获取调试堆的当前状态并将其存储在应用程序提供的 _CrtMemState 结构中 |
_CrtMemDifference |
比较两个内存状态的重要差异,并返回结果 |
_CrtMemDumpAllObjectsSince |
在提取指定检查点之后或者在开始执行程序时转储堆上的有关对象的信息 |
_CrtMemDumpStatistics |
以用户可读的形式转储指定内存状态的调试标头信息 |
_CrtReportBlockType |
返回与给定调试堆块指针相关联的块类型/子类型。 |
_CrtSetAllocHook |
通过挂钩到 C 运行时调试内存分配过程安装客户端定义的分配函数 |
_CrtSetBreakAlloc |
在指定的对象分配序号上设置断点 |
_CrtSetDbgFlag |
检索或修改 _crtDbgFlag 标志的状态,以控制调试堆管理器的分配行为 |
_CrtSetDumpClient |
安装每次调用调试转储函数来转储 _CLIENT_BLOCK 类型内存块时所调用的应用程序定义的函数 |
_CrtSetReportFile |
标识被 _CrtDbgReport 用作特定报表类型的目标的文件或流 |
_CrtSetReportHook |
通过以下方式安装客户端定义的报告函数:将该函数挂钩到 C 运行时调试报告过程中 |
%> | 通过以下方式安装或卸载客户端定义的报告函数:将该函数挂钩到 C 运行时调试报告过程中。 |
_CrtSetReportMode |
指定由 _CrtDbgReport 生成的特定报表类型的一般目标 |
_RPT[0,1,2,3,4] |
通过调用带格式字符串和可变数量参数的 _CrtDbgReport 生成调试报表来跟踪应用程序的进度。 提供了无源文件和行号信息。 |
_RPTF[0,1,2,3,4] |
类似于 _RPTn 宏,但提供发起报表请求的源文件名和行号 |
_calloc_dbg |
在具有额外空间的堆中为调试标头和覆盖缓冲区分配指定数量的内存块 |
_expand_dbg |
通过展开或收缩块调整堆上指定内存块的大小 |
_free_dbg |
释放堆上的内存块 |
%> | 创建指定相对路径名称的绝对或完整路径名称,使用 _malloc_dbg 来分配内存。 |
%> | 获取当前工作目录,使用 _malloc_dbg 来分配内存。 |
_malloc_dbg |
在具有额外空间的堆中为调试标头和覆盖缓冲区分配内存块 |
_msize_dbg |
计算堆上的内存块大小 |
_realloc_dbg |
通过移动和/或调整块的大小重新分配堆上的指定内存块 |
%> | 复制字符串,使用 _malloc_dbg 来分配内存。 |
%> | 生成可用于创建临时文件的名称,使用 _malloc_dbg 来分配内存。 |
无法提供源代码形式的 C 运行时例程
可以使用调试程序逐步完成调试过程中大部分 C 运行时例程的源代码。 但是,Microsoft 认为一些技术是专有的,因此不会为这些例程的子集提供源代码。 这些例程大多数属于异常处理或浮点处理组,但也包含一些其他例程。 下表列出了这些例程。
尽管为大部分 printf
和 scanf
例程提供源代码,它们仍然会对另一个不提供源代码的例程执行内部调用。
应用程序调式版本中存在行为差异的例程
从应用程序的调试版本执行调用时,某些 C 运行时函数和 C++ 运算符存在行为差异。 (可通过定义 _DEBUG
标志或与 C 运行时库的调试版本进行链接来创建应用程序的调试版本。)行为差异通常包含由例程提供的额外功能或信息,以支持调试过程。 下表列出了这些例程。
C abort
例程
C assert
例程
C++ delete
运算符
C++ new
运算符