_CrtDbgReport、_CrtDbgReportW

生成具有调试消息的报告并将该报告发送到三个可能的目标(仅限调试版本)。

int _CrtDbgReport(     int reportType,    const char *filename,    int linenumber,    const char *moduleName,    const char *format [,    argument] ...  ); int _CrtDbgReportW(     int reportType,    const wchar_t *filename,    int linenumber,    const wchar_t *moduleName,    const wchar_t *format [,    argument] ...  );

参数

  • reportType
    报告类型:_CRT_WARN_CRT_ERROR_CRT_ASSERT

  • filename
    指向声明/报告所出现位置的源文件名的指针或 NULL。

  • linenumber
    声明/报告所出现位置的源文件中的行号或 NULL。

  • moduleName
    指向声明或报告所出现位置的模块名称(.exe 或 .dll)的指针。

  • format
    指向用于创建用户消息的格式控件字符串的指针。

  • argument
    由 format 使用的可选替换参数。

返回值

对于所有报告目标,如果发生错误,则 _CrtDbgReport_CrtDbgReportW 将返回 –1;如果未遇到错误,则返回 0。 但是,当报告目标是调试消息窗口且用户单击了“重试”按钮时,这些函数将返回 1。 如果用户在“调试消息”窗口中单击了“中止”按钮,这些函数将立即中止且不会返回值。

_RPT、_RPTF 调试宏调用 _CrtDbgReport 生成其调试报告。 这些宏以及 _ASSERT[E]_RPTWn 和 _RPTFWn 的宽字符版本使用 _CrtDbgReportW 生成其调试报告。 当 _CrtDbgReport_CrtDbgReportW 返回 1 时,这些宏将启动调试程序,前提是实时 (JIT) 调试处于启用状态。

备注

_CrtDbgReport_CrtDbgReportW 可将调试报告发送到三个不同的目标:调试报告文件、调试监视器(Visual Studio 调试程序)或调试消息窗口。 两个配置函数 _CrtSetReportMode_CrtSetReportFile 可用于为每种报告类型指定一个或多个目标。 这些函数允许对每种报告类型的一个或多个报告目标进行单独控制。 例如,它可能指定仅将 _CRT_WARN 的 reportType 发送到调试监视器,而将 _CRT_ASSERT 的 reportType 发送到调试消息窗口和用户定义的报告文件。

_CrtDbgReportW_CrtDbgReport 的宽字符版本。 它的所有输出和字符串参数都采用宽字符字符串;否则它会与单字节字符版本完全相同。

通过将 argument[n] 参数替换到 format 字符串中,并使用由 printf 或 wprintf 函数定义的相同规则,_CrtDbgReport_CrtDbgReportW 可为调试报告创建用户消息。 然后,基于当前报告模式以及为 reportType 定义的文件,这些函数可生成调试报告并确定一个或多个目标。 将报告发送到调试消息窗口后,窗口中显示的信息将包含 filename、lineNumber 和 moduleName。

下表列出了一种或多种报告模式和文件的可用选项,以及 _CrtDbgReport_CrtDbgReportW 产生的行为。 在 <crtdbg.h> 中将这些选项定义为位标志。

报告模式

报告文件

_CrtDbgReport_CrtDbgReportW 行为

_CRTDBG_MODE_DEBUG

不适用

使用 Windows OutputDebugString API 写入消息。

_CRTDBG_MODE_WNDW

不适用

调用 Windows MessageBox API 创建消息框,以显示该消息以及“中止”、“重试”和“忽略”按钮。 如果用户单击“中止”,则 _CrtDbgReport_CrtDbgReport 将立即中止。 如果用户单击“重试”,它将返回 1。 如果用户单击“忽略”,则执行将继续且 _CrtDbgReport_CrtDbgReportW 将返回 0。 请注意,在存在错误条件时单击“忽略”通常会导致“未定义的行为”。

_CRTDBG_MODE_FILE

__HFILE

使用 Windows WriteFile API 将消息写入用户提供的 HANDLE,并且不会验证文件句柄的有效性;应用程序负责打开报告文件并传递有效的文件句柄。

_CRTDBG_MODE_FILE

_CRTDBG_FILE_STDERR

将消息写入 stderr。

_CRTDBG_MODE_FILE

_CRTDBG_FILE_STDOUT

将消息写入 stdout。

可将报告发送至一个、两个或三个目标,或不发送至任何目标。 有关指定一种或多种报告模式和报告文件的详细信息,请参阅 _CrtSetReportMode_CrtSetReportFile 函数。 有关使用调试宏和报告函数的详细信息,请参阅用于报告的宏

如果你的应用程序需要的灵活性比 _CrtDbgReport_CrtDbgReportW 提供的灵活性更大,则你可以通过使用 _CrtSetReportHook 函数来写入你自己的报告函数并将它挂接到 C 运行时库报告机制中。

要求

例程

必需的标头

_CrtDbgReport

<crtdbg.h>

_CrtDbgReportW

<crtdbg.h>

_CrtDbgReport_CrtDbgReportW 是 Microsoft 扩展。 有关详细信息,请参阅兼容性

仅限 C 运行时库的调试版本。

示例

// crt_crtdbgreport.c
#include <crtdbg.h>

int main(int argc, char *argv[]) {
#ifdef _DEBUG
   _CrtDbgReport(_CRT_ASSERT, __FILE__, __LINE__, argv[0], NULL);
#endif
}

有关如何更改报告函数的示例,请参阅 crt_dbg2

.NET Framework 等效项

请参见

参考

调试例程

_CrtSetReportMode

_CrtSetReportFile

printf、_printf_l、wprintf、_wprintf_l

_DEBUG