1. 简单介绍
Any single call to DbgPrint, DbgPrintEx, KdPrint, or KdPrintEx will only transmit 512 bytes of information. Any output longer than this will be lost. The DbgPrint buffer itself can hold up to 4 KB of data on a free build of Windows, and up to 32 KB of data on a checked build of Windows. 也就是说DbgPrint 中BUFFER容量最大为512字节
DbgPrint (
IN PCH Format,
...
)
{
va_list arglist;
UCHAR Buffer[512];
STRING Output;
//
// Format the output into a buffer and then print it.
//
va_start(arglist, Format);
Output.Length = _vsnprintf(Buffer, sizeof(Buffer), Format, arglist);
Output.Buffer = Buffer;
printf("%s", Buffer);
return 0;
}
2. 使用举例
1) 直接打印字符串。
DbgPrint(“Hello World!”);
2) 空结尾的字符串,你可以用普通得C语法表示字符串常量
char variable_string[] = “Hello World”;
DbgPrint(“%s”,variable_string);
3) 空结尾的宽字符串(WCHAR类型)
WCHAR string_w[] = L“Hello World!”;
DbgPrint(“%ws”,string_w);
或者
DbgPrint(“%S”,string_w);
4)Unicode串,由UNICODE_STRING结构描述,包含16位字符。
typedef struct _UNICODE_STRING{
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
}UNICODE_STRING , *PUNICODE_STRING;
UNICODE_STRING string_unicode = L”Hello World!”;
DbgPrint(“%wZ\n”,string_unicode.Buffer); 或者DbgPrint(“%wZ\n”,string_unicode);
5) ANSI串,由ANSI_STRING结构描述,包含8位字符。
typedef struct _STRING{
USHORT Length;
USHORT MaximumLength;
PCHAR Buffer;
}STRING, *PANSI_STRING;
STRING bar;
或者:ANSI_STRING bar;
RtlInitAnsiString(&bar,”Hello World!”);
DbgPrint(“%wz\n”,bar.Buffer);
DebugPrint格式说明符
符号 格式说明符 类型
%c, %lc ANSI字符 char
%C, %wc 宽字符 wchar_t
%d, %i 十进制有符号整数 int
%D 十进制_int64 _int64
%L 十六进制的LARGE_INTEGER LARGE_INTEGER
%s, %ls NULL终止的ANSI字符串 char*
%S, %ws NULL终止的宽字符串 wchar_t*
%Z ANSI_STRING字符串
%wZ UNICODE_STRING字符串
%u 十进制的ULONG ULONG
%x 小写字符十六进制的ULONG ULONG
%X 大写字符十六进制的ULONG ULONG
%p 指针Pointer 32/64位
根据DDK上说明,Unicode格式(%C, %S, %lc, %ls, %wc, %ws, and %wZ)只能在 IRQL = PASSIVE_LEVEL时才能使用.
3. 在哪查看
去微软下载Dbgview.exe
另外:Dbgview也可以看TRACE输出的内容。但是TRACE只能在MFC下使用;非MFC程序可以使用OutputDebugString,但是此函数只能输出一个字符串,不能做格式化输出,如果需要可以自己封装:
void _trace(TCHAR *format ...)
{
TCHAR buffer[1000];
va_list argptr;
va_start(argptr format);
wvsprintf(buffer format argptr);
va_end(argptr);
OutputDebugString(buffer);}