繁体   English   中英

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

[英]how to write to output window in Visual Studio 2013?

我能够编译并运行我的可视c ++程序。 它不是控制台应用程序。 我正在修改现有的MFC应用程序。 我正在尝试对程序进行故障排除。 我无法在调试中运行并获取所需的跟踪信息,因为我的程序还会读取鼠标光标。 我也尝试使用消息框输出此字符串,但是同样,消息框会干扰鼠标。

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

cout << "something" << endl;

但是,在输出窗口中,我什么都看不到。

看着SO帖子,我尝试

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

错误C2664:'无效OutputDebugStringW(LPCWSTR)':无法将参数1从'std :: string'转换为'LPCWSTR'

因此更改为std :: wstring stro

OutputDebugString(stro.c_str());

附加一个整数,我不得不

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

但是,如果不在DEBUG中运行,则无法在窗口中看到输出。 有没有办法查看非DEBUG中的输出? 这令人惊讶地令人沮丧。

在评论中,建议编写一个单独的重载类。 这似乎太过分了。 Java即使在GUI程序中也具有System.out.println。 Android具有Log.v()。 遗憾的是,此处没有等效项。

控制台应用程序具有控制台输出,这是cout发送到的内容。 由于这不是控制台应用程序,因此您将尝试另一种方法。 奇怪的是,您反对“当我不在调试状态时,我看不到调试输出”,这就是重点-不要使用OutputDebugString并期望它用于调试输出以外的其他目的。

我认为,了解您的应用程序正在执行的,而不与它在调试器下进行交互的最佳方法(我知道尝试调试不断被调试活动重新触发的事件处理程序的挫败感)是尝试跟踪点。 早在2006年,我就在博客上发布了有关它们的信息 ,但它们仍然是一项很棒的技术。 读取鼠标光标不会干扰跟踪点,您可以打开或关闭它们,而无需重建应用程序或更改任何代码。

设置一个断点,然后右键单击红点并选择“命中时”。 您可以调整输出窗口中显示的默认消息,以显示您感兴趣的任何值-您甚至可以在跟踪消息中调用函数,就像您在博客条目中看到的那样,其中我调用了a的size()方法采集。 如有必要,您甚至可以调试发行版。

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

如果您已经有很多'cout'风格的调试代码,最简单的方法可能是将其替换为自定义的ostream重载,该重载确实会打印到输出窗格中。 这是一个这是另一个

如果您可以完全重写调试代码,则一些围绕OutputDebugString的宏包装程序可能更适合您。

具有用于调试的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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM