如何在Win32应用程序中打印到调试输出窗口?

izb*_*izb 86 c++ console winapi visual-studio-2005 visual-studio

我有一个win32项目,我已经加载到Visual Studio 2005中.我希望能够将内容打印到Visual Studio输出窗口,但我不能为我的生活找出方法.我试过'printf'和'cout <<',但是我的信息一直没有打印.

是否有某种特殊的方式来打印到Visual Studio输出窗口?

Mar*_*age 129

你可以用OutputDebugString.OutputDebugString是一个宏,根据您的构建选项映射到OutputDebugStringA(char const*)OutputDebugStringW(wchar_t const*).在后一种情况下,您必须为该函数提供宽字符串.要创建宽字符文字,您可以使用L前缀:

OutputDebugStringW(L"My output string.");
Run Code Online (Sandbox Code Playgroud)

通常你会_T像这样使用宏版本和宏:

OutputDebugString(_T("My output string."));
Run Code Online (Sandbox Code Playgroud)

如果您的项目配置为为UNICODE构建,它将扩展为:

OutputDebugStringW(L"My output string.");
Run Code Online (Sandbox Code Playgroud)

如果您不是为UNICODE构建,它将扩展为:

OutputDebugStringA("My output string.");
Run Code Online (Sandbox Code Playgroud)

  • @CDT:这取决于`myStr`的类型.是`char*`,`wchar_t*`还是`LPTSTR`?假设它是`char*`你只需要调用`OutputDebugStringA(myStr)`或者使用带有`wchar_t*`的`OutputDebugStringW`和带有`LPTSTR`的`OutputDebugString`,如我的答案所述. (4认同)
  • 完善!谢谢.但是为了完整性,事实证明我必须这样做:OutputDebugString(TEXT("Hello console world")); ..可能是由于某种与unicode相关的构建选项. (2认同)

Zac*_*Zac 27

如果项目是GUI项目,则不会显示任何控制台.要将项目更改为控制台,您需要转到项目属性面板并设置:

  • 在"链接器 - >系统 - >子系统 "中,值" Console(/ SUBSYSTEM:CONSOLE) "
  • 在" C/C++ - >预处理器 - >预处理器定义 "中添加" _CONSOLE "定义

只有拥有经典的" int main() "入口点时,此解决方案才有效.

但是如果你喜欢我的情况(一个openGL项目),你不需要编辑属性,因为这样做效果更好:

AllocConsole();
freopen("CONIN$", "r",stdin);
freopen("CONOUT$", "w",stdout);
freopen("CONOUT$", "w",stderr);
Run Code Online (Sandbox Code Playgroud)

printf和cout将照常工作.

如果在创建窗口之前调用AllocConsole,控制台将出现在窗口后面,如果之后调用它,它将显示在前面.


Rin*_*ing 12

要打印到real控制台,您需要使用链接器标志使其可见/SUBSYSTEM:CONSOLE.额外的控制台窗口很烦人,但出于调试目的,它非常有价值.

OutputDebugString 在调试器内运行时打印到调试器输出.

  • 您还可以使用AllocConsole()分配自己的控制台 (6认同)

小智 6

如果要打印十进制变量:

wchar_t text_buffer[20] = { 0 }; //temporary buffer
swprintf(text_buffer, _countof(text_buffer), L"%d", your.variable); // convert
OutputDebugString(text_buffer); // print
Run Code Online (Sandbox Code Playgroud)


Aut*_*act 5

考虑使用 VC++ 运行时宏来报告_RPT N () 和 _RPTF N ()

您可以使用 CRTDBG.H 中定义的 _RPTn 和 _RPTFn 宏来代替 printf 语句的使用进行调试。当 _DEBUG 未定义时,这些宏会在您的发布版本中自动消失,因此无需将它们包含在 #ifdefs 中。

例子...

if (someVar > MAX_SOMEVAR) {
    _RPTF2(_CRT_WARN, "In NameOfThisFunc( )," 
         " someVar= %d, otherVar= %d\n", someVar, otherVar );
}
Run Code Online (Sandbox Code Playgroud)

或者您可以直接使用 VC++ 运行时函数_CrtDbgReport、_CrtDbgReportW

_CrtDbgReport 和 _CrtDbgReportW 可以将调试报告发送到三个不同的目标:调试报告文件、调试监视器(Visual Studio 调试器)或调试消息窗口。

_CrtDbgReport 和 _CrtDbgReportW 使用 printf 或 wprintf 函数定义的相同规则,通过将参数 [n] 参数替换到格式字符串中,为调试报告创建用户消息。然后,这些函数根据为 reportType 定义的当前报告模式和文件生成调试报告并确定一个或多个目的地。当报告发送到调试消息窗口时,文件名、行号和模块名将包含在窗口中显示的信息中。


vla*_*lad 5

如果您需要查看广泛使用 printf 的现有程序的输出,而无需更改代码(或仅进行最小的更改),您可以按如下方式重新定义 printf 并将其添加到公共标头 (stdafx.h)。

int print_log(const char* format, ...)
{
    static char s_printf_buf[1024];
    va_list args;
    va_start(args, format);
    _vsnprintf(s_printf_buf, sizeof(s_printf_buf), format, args);
    va_end(args);
    OutputDebugStringA(s_printf_buf);
    return 0;
}

#define printf(format, ...) \
        print_log(format, __VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)