%>
生成具有调试消息的报告并将该报告发送到三个可能的目标(仅限调试版本)。
语法
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
、_ASSERTE
、_RPTW
和 _RPTFW
的宽字符版本使用 _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 |
不适用 | 调用 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
。