调试例程

C 运行时库的调试版本提供了很多诊断服务,便于调试程序并允许开发人员执行以下操作:

  • 在调试期间直接执行运行时函数

  • 解决断言、错误和异常

  • 跟踪堆分配,并防止出现内存泄漏

  • 向用户报告调试消息

    若要使用这些例程,必须定义 _DEBUG 标志。 所有这些例程在零售版本的应用程序中不执行任何操作。 有关如何使用新的调试例程的详细信息,请参阅 CRT 调试技术

C 运行时库例程的调试版本

例程 使用
_ASSERT 计算表达式,并在结果是 FALSE 时生成调试报告
_ASSERTE 类似于 _ASSERT,但包括生成报告中的失败表达式
_CrtCheckMemory 确认在调试堆上分配的内存块的完整性
_CrtDbgBreak 设置一个断点。
_CrtDbgReport、_CrtDbgReportW 生成具有用户消息的调试报表并将此报表发送到三个可能的目标
_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 运行时调试报告过程中
_CrtSetReportHook2、_CrtSetReportHookW2 通过以下方式安装或卸载客户端定义的报告函数:将该函数挂钩到 C 运行时调试报告过程中。
_CrtSetReportMode 指定由 _CrtDbgReport 生成的特定报表类型的一般目标
_RPT[0,1,2,3,4] 通过调用带格式字符串和可变数量参数的 _CrtDbgReport 生成调试报表来跟踪应用程序的进度。 提供了无源文件和行号信息。
_RPTF[0,1,2,3,4] 类似于 _RPTn 宏,但提供发起报表请求的源文件名和行号
_calloc_dbg 在具有额外空间的堆中为调试标头和覆盖缓冲区分配指定数量的内存块
_expand_dbg 通过展开或收缩块调整堆上指定内存块的大小
_free_dbg 释放堆上的内存块
_fullpath_dbg、_wfullpath_dbg 创建指定相对路径名称的绝对或完整路径名称,使用 _malloc_dbg 来分配内存。
_getcwd_dbg、_wgetcwd_dbg 获取当前工作目录,使用 _malloc_dbg 来分配内存。
_malloc_dbg 在具有额外空间的堆中为调试标头和覆盖缓冲区分配内存块
_msize_dbg 计算堆上的内存块大小
_realloc_dbg 通过移动和/或调整块的大小重新分配堆上的指定内存块
_strdup_dbg、_wcsdup_dbg 复制字符串,使用 _malloc_dbg 来分配内存。
_tempnam_dbg、_wtempnam_dbg 生成可用于创建临时文件的名称,使用 _malloc_dbg 来分配内存。

可以使用调试例程逐步完成调试过程中大部分其他 C 运行时例程的源代码。 但是,Microsoft 认为一些技术是专有的,因此,不会为这些例程提供源代码。 这些例程大多数属于异常处理或浮点处理组,但也包含一些其他例程。 下表列出了这些例程。

无法提供源代码形式的 C 运行时例程

acos、acosf、acosl _fpclass _nextafter
asin _fpieee_flt pow
atan、atan2 _fpreset printf、_printf_l、wprintf、_wprintf_lprintf_s、_printf_s_l、wprintf_s、_wprintf_s_l*
_cabs frexp _scalb
ceil _hypot scanf、_scanf_l、wscanf、_wscanf_lscanf_s、_scanf_s_l、wscanf_s、_wscanf_s_l*
_chgsign、_chgsignf、_chgsignl _isnan setjmp
_clear87、_clearfp _j0 sin
_control87、_controlfp、__control87_2 _j1 sinh
copysign、copysignf、copysignl、_copysign、_copysignf、_copysignl _jn sqrt
cos ldexp _status87、_statusfp
cosh log tan
Exp log10 tanh
fabs _logb _y0
_finite longjmp _y1
floor _matherr _yn
fmod modf

* 尽管为大部分此例程提供源代码,它仍会对另一个不提供源代码的例程执行内部调用。

从应用程序的调试版本执行调用时,某些 C 运行时函数和 C++ 运算符存在行为差异。 (请注意,应用程序的调试版本可以通过定义 _DEBUG 标志或与 C 运行时库的调试版本进行链接来完成。)行为差异通常包含由例程提供的额外功能或信息,以支持调试过程。 下表列出了这些例程。

应用程序调式版本中存在行为差异的例程

C abort 例程 C++ delete 运算符
Cassert 例程 C++ new 运算符

另请参阅

按类别分的运行时例程
运行时错误检查