[英]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.