如何在Visual Studio 2013中写入输出窗口?

时间:2014-06-26 19:24:08

标签: visual-studio visual-c++ visual-studio-2013

我能够编译和运行我的visual c ++程序。它不是控制台应用程序。我正在修改现有的MFC应用程序。我正在尝试解决我的程序问题。我无法在调试中运行并获得我需要的跟踪,因为我的程序也会读取鼠标光标。我还尝试使用消息框输出此字符串,但同样,消息框会干扰鼠标。

在输出窗口中,我右键单击并确保已启用程序输出。

cout << "something" << endl;

但是,在输出窗口中,我什么也没看到。

看看SO帖子,我试过

std::string stro = "something ";
OutputDebugString(stro);
  

错误C2664:'void OutputDebugStringW(LPCWSTR)':无法转换   参数1从'std :: string'到'LPCWSTR'

因此改为std :: wstring stro

OutputDebugString(stro.c_str());

追加一个int,我不得不

std::wostringstream wso;    
wso << i;   
stro = stro + wso.str();
OutputDebugString(stro.c_str());

但是当我没有在DEBUG中运行时,我看不到窗口中的输出。有没有办法在非DEBUG中看到输出?这令人惊讶地令人沮丧。

在评论中,建议写一个单独的重载课程;这似乎有点矫枉过正。即使在GUI程序中,Java也有System.out.println。 Android有Log.v()。很可惜这个等价物在这里没有。

3 个答案:

答案 0 :(得分:2)

控制台应用程序具有控制台输出,这是cout发送的内容。由于这不是一个控制台应用程序,您将尝试另一种方法。你反对它很奇怪&#34;当我不在Debug&#34;中时,我看不到调试输出,这是它的重点 - 不要使用OutputDebugString并期望它不是调试输出。

我认为了解应用程序正在做什么的最佳方法,而不是在调试器下与它进行交互(我知道尝试调试不断被调试活动重新触发的事件处理程序的挫败感)是尝试跟踪点。我{2006年} blogged about them,他们仍然是一个伟大的技术。读取鼠标光标不会干扰跟踪点,您可以在不重建应用程序或进行任何代码更改的情况下打开和关闭它们。

设置断点,然后右键单击红点并选择When Hit。您可以调整进入输出窗口的默认消息,以显示您感兴趣的任何值 - 您甚至可以在跟踪消息中调用函数,您可以在博客条目中看到我调用的size()方法采集。如有必要,您甚至可以调试发布版本。

答案 1 :(得分:2)

实际上,OutputDebugStrng 应该在发布版本中工作 - 只要您从调试器运行应用程序即可。但是,cout无法将输出路由到VS输出窗格。

如果你已经有很多&#39; cout&#39;样式调试代码,最简单的路径可能是用自定义ostream重载替换它,它会打印到输出窗格。 Here's onehere's another

如果您可以完全重写调试代码,某些macro wrappers around OutputDebugString可能会更适合您。

答案 2 :(得分:1)

使用stdout / stderr控制台窗口进行调试非常有用,在使用基于WinMain的应用程序时,我总是会错过它。我使用这个代码片段为Windows应用程序创建一个控制台(并用现有的记录器链接它等)。运行它之后,你的cout / cerr应该可以正常工作。可以使用DebugView应用程序在DevStudio外部看到OutputDebugString输出,但我更喜欢这个:

#include <io.h>
#include <fcntl.h>
...

//  DOS box console for stdin/stdout/stderr
void makeConsole()
{
    AllocConsole();

    HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);
    int hCrt = _open_osfhandle((long)handle_out, _O_TEXT);
    FILE* hf_out = _fdopen(hCrt, "w");
    setvbuf(hf_out, NULL, _IONBF, 2);
    *stdout = *hf_out;

    HANDLE handle_in = GetStdHandle(STD_INPUT_HANDLE);
    hCrt = _open_osfhandle((long)handle_in, _O_TEXT);
    FILE* hf_in = _fdopen(hCrt, "r");
    setvbuf(hf_in, NULL, _IONBF, 2);
    *stdin = *hf_in;

    HANDLE handle_err = GetStdHandle(STD_ERROR_HANDLE);
    hCrt = _open_osfhandle((long)handle_err, _O_TEXT);
    FILE* hf_err = _fdopen(hCrt, "w");
    setvbuf(hf_err, NULL, _IONBF, 2);
    *stderr = *hf_err;

    ios::sync_with_stdio();
}