43

It seems rather tedious to output to debug window. Where can I find cout output if I am writing a non-console information ?

Like:

double i = a / b;
cout << b << endl;//I want to check out whether b is zero. It seems the output cannot be found anywhere.
4

8 回答 8

110

问题很清楚。如何使用 std::cout 在 Visual Studio 中调试非控制台应用程序。

答案很明确:你不能。也就是说,Visual Studio 不支持将 std::cout 作为非控制台应用程序的调试工具。

这是 Visual Studio 的一个严重限制,甚至可能无法满足 C++ 标准。我觉得很遗憾在这里看到无用的“答案”试图隐藏他们宝贵的 Visual Studio 的这个缺陷。

于 2013-09-30T13:17:51.260 回答
35

对于 Windows 解决方案,您可以分配一个控制台,并将 cout/cin 绑定到它。例如:

AllocConsole();
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);  

文档:
https ://msdn.microsoft.com/en-us/library/windows/desktop/ms681944%28v=vs.85%29.aspx

于 2015-04-10T19:22:30.283 回答
17

要将字符串输出到调试控制台,请使用OutputDebugStringA. 请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/aa363362%28v=vs.85%29.aspx

要将变量值输出到调试控制台,请使用std::ostringstream,将字符串发送到OutputDebugStringA

过多的输出语句会导致程序严重变慢。然而,捕捉调试器有问题的东西是一种很好的技术,例如在使用基指针时实际的子成员。

于 2013-05-23T01:10:21.447 回答
16

解决方案:此答案解决了问题,并允许您将控制台输出重定向到 Visual Studio 输出窗口。首先,我们需要一个覆盖默认 cout 字符串流的类:

class dbg_stream_for_cout
    : public std::stringbuf
{
public:
    ~dbg_stream_for_cout() { sync(); }
    int sync()
    {
        ::OutputDebugStringA(str().c_str());
        str(std::string()); // Clear the string buffer
        return 0;
    }
};
dbg_stream_for_cout g_DebugStreamFor_cout;

然后,在某个你想“激活”写入 VS 输出窗口的地方:

std::cout.rdbuf(&g_DebugStreamFor_cout); // Redirect std::cout to OutputDebugString!
于 2017-11-15T16:07:29.697 回答
6

我想给我的 2 美分。

鉴于这可能是关于符合 C++ 标准或我们可以使用的 VS 问题OutputDebugStringA,如果您无法修改代码库,您可能会喜欢将 std::cout 简单地重定向到其他东西的想法,比如文件。

因此,在不更改代码库的情况下,您可以执行此处建议的操作:如何将 cin 和 cout 重定向到文件?

浓缩:

  • 添加包含#include <fstream>
  • 在您的应用程序开始时,在一些初始化中,在登录之前,您可以使用:
std::ofstream out("out.txt");
std::streambuf *coutbuf = std::cout.rdbuf(); //save old buf
std::cout.rdbuf(out.rdbuf()); //redirect std::cout to out.txt!
  • 在您的应用程序/日志记录结束时:

std::cout.rdbuf(coutbuf); //再次重置为标准输出

希望这可以帮助某人,感谢 Nawaz 在另一个线程中提供了答案。

于 2017-06-04T22:23:49.257 回答
5

不要使用 cout,而是创建一个日志文件并将您想要的任何内容写入其中。

编辑:使用这个简单的代码写入日志文件。

ofstream log;
log.open ("log.txt");
log << "Writing this to a file.\n";
log.close();
于 2013-05-23T00:40:12.287 回答
0

您可以使用 .Net 函数,例如 System::Diagnostics::Debug::WriteLine("your message")。您甚至可以添加一个仅在调试模式而不是在发布模式下打印的条件。例如:

#ifdef DEBUG   
   System::Diagnostics::Debug::WriteLine("your message");
#endif   
于 2019-11-23T08:00:05.207 回答
-1

是的,确实,这很烦人。

这是我的做法:

#define DBOUT( s )            \
{                             \
std::wostringstream os_;    \
   os_ << s;                   \
   OutputDebugStringW( os_.str().c_str() );  \
}
// example :    DBOUT("some text " << some_variable << "   some more text" << some_other_varaible << "\n");
于 2020-08-21T18:49:54.357 回答