无法在 OutputDebugStringW 中使用换行符,在 DbgView 中出现奇怪的行为
Can't use newline in OutputDebugStringW, weird behavior in DbgView
我在我的应用程序中使用了 OutputDebugStringW。由于 WinDBG 不会自动附加换行符,因此我不得不在输出缓冲区中添加 \n
:
#include <iostream>
#include <windows.h>
int main()
{
wchar_t buff[100];
ZeroMemory(buff, sizeof(buff));
_snwprintf_s(buff, sizeof(buff) / sizeof(wchar_t) - 1, L"[test] %d", GetCurrentThreadId());
buff[wcslen(buff)] = L'\n';
OutputDebugStringW(buff);
char buff2[100];
ZeroMemory(buff2, sizeof(buff2));
snprintf(buff2, sizeof(buff2), "[test2] %d", GetCurrentThreadId());
buff2[strlen(buff2)] = '\n';
OutputDebugStringA(buff2);
}
它有效,但 DbgView 打印出意想不到的东西:
- 对于 OutputDebugStringA,换行正常
- 对于 OutputDebugStringW,无法识别换行符
如果我不附加换行符,它们都可以正常工作。这里有什么问题?
正如 Retired Ninja 所指出的,_snwprintf_s 如果程序是在 DEBUG 模式下构建的,则用另一个值填充缓冲区。在这种情况下,wchar_t 填充为 0xFEFE:
如果我在 Release 模式下编译程序,字符串将以 NULL 结尾。
我在我的应用程序中使用了 OutputDebugStringW。由于 WinDBG 不会自动附加换行符,因此我不得不在输出缓冲区中添加 \n
:
#include <iostream>
#include <windows.h>
int main()
{
wchar_t buff[100];
ZeroMemory(buff, sizeof(buff));
_snwprintf_s(buff, sizeof(buff) / sizeof(wchar_t) - 1, L"[test] %d", GetCurrentThreadId());
buff[wcslen(buff)] = L'\n';
OutputDebugStringW(buff);
char buff2[100];
ZeroMemory(buff2, sizeof(buff2));
snprintf(buff2, sizeof(buff2), "[test2] %d", GetCurrentThreadId());
buff2[strlen(buff2)] = '\n';
OutputDebugStringA(buff2);
}
它有效,但 DbgView 打印出意想不到的东西:
- 对于 OutputDebugStringA,换行正常
- 对于 OutputDebugStringW,无法识别换行符
如果我不附加换行符,它们都可以正常工作。这里有什么问题?
正如 Retired Ninja 所指出的,_snwprintf_s 如果程序是在 DEBUG 模式下构建的,则用另一个值填充缓冲区。在这种情况下,wchar_t 填充为 0xFEFE:
如果我在 Release 模式下编译程序,字符串将以 NULL 结尾。