捕获控制台输出以在VS中进行调试?

时间:2020-03-06 14:37:00  来源:igfitidea点击:

在VS的外部工具设置下,有一个"使用输出窗口"复选框,用于捕获工具命令行输出并将其转储到VS选项卡。

问题是:当我按F5键时,我的程序可以得到相同的处理吗?

编辑:FWIW我在Cbut中,如果那对答案有所帮助,那么答案就不太可能是我在寻找的东西。

我想要的是获取程序的输出流,并使用在cmd提示符下使用输出重定向(" |"和">")的相同设备将其传输到VS中的输出选项卡。

解决方案

System.Diagnostics.Debug.Writeline()或者Trace.Writeline()

我们可以使用Systems.Diagnostics.Trace类而不是控制台(或者在控制台之外)将输出写入"输出"窗口。它需要一些配置,但是可以工作。这是否符合要求?

我们也可以根据本文添加自己的标签,但我从未尝试过。

我将在这里做一些假设。首先,我假设我们正在谈论的是从应用程序(无论是从控制台应用程序还是从Windows GUI应用程序)输出的printf。我的第二个假设是C语言。

据我所知,我们不能将printf输出直接定向到dev studio中的输出窗口,反之亦然。 [OP强调的内容]

可能有办法,但我不知道。我们可以做的一件事是将printf函数调用定向到我们自己的例程,该例程将

  • 调用printf并打印字符串
  • 调用OuputDebugString()将字符串打印到输出窗口

我们可以做几件事来实现这个目标。首先是编写我们自己的printf函数,然后调用printf和OuputDebugString()

void my_printf(const char *format, ...)
{
    char buf[2048];

    // get the arg list and format it into a string
    va_start(arglist, format);
    vsprintf_s(buf, 2048, format, arglist);
    va_end(arglist); 

    vprintf_s(buf);            // prints to the standard output stream
    OutputDebugString(buf);    // prints to the output window
}

上面的代码大部分未经测试,但是应该可以理解所有概念。

如果我们不是在C / C ++中执行此操作,则此方法将对我们不起作用。 :-)

我们应该能够在文本文件中捕获输出并使用它。

我没有VS,因此这是从内存中获取的:

  • 创建一个C ++项目
  • 打开项目设置,调试选项卡
  • 启用托管调试
  • 编辑命令行以添加"`> output.txt"
  • 在调试器下运行程序

如果一切按我记得的方式进行,即使我们实际上没有在CMD.EXE下运行,这也会将STDOUT重定向到文件。

(调试器具有自己的重定向语法实现,该实现与cmd并非100%相同,但是相当不错。)

现在,如果我们在VS中打开此文件,尽管不在我们希望的窗口中,但仍然可以在VS中看到输出。

也许这对我们有用:在Main的close}上设置一个断点,然后在关闭之前查看控制台窗口。如果需要,我们甚至可以从中复制文本。

在用于开发的每台计算机上,都以某种方式配置控制台窗口,这恰好使此方法更好地工作:

  • 运行cmd.exe
  • ALT-空格键,D
  • 在选项中,启用快速编辑模式。
  • 在"布局"中,将"缓冲区高度"设置为9999
  • 点击确定
  • 退出CMD窗口。