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

时间:2008-09-23 18:22:05

标签: c# visual-studio debugging

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

问题是:当我点击F5时,我可以为我的程序获得相同的处理吗?

编辑: FWIW我在C#中,但如果这对您的答案有所影响,那么您的答案就不太可能是我正在寻找的。

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

6 个答案:

答案 0 :(得分:3)

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

我没有VS方便,所以这是来自记忆:

  1. 创建C ++项目
  2. 打开项目设置,调试选项卡
  3. 启用托管调试
  4. 编辑命令行以添加“> output.txt
  5. 在调试程序下运行程序
  6. 如果事情按我记忆的方式工作,这会将STDOUT重定向到一个文件,即使你实际上并没有在CMD.EXE下运行。

    (调试器有自己的重定向语法实现,与cmd不是100%相同,但它非常好。)

    现在,如果你在VS中打开这个文件,你仍然可以看到VS中的输出,虽然不是你想要的完全相同的窗口。

答案 1 :(得分:3)

控制台可以将其输出重定向到任何文本编写器。如果您实现了写入Diagnostics.Debug的文本编写器,那么您已经完成了设置。

这是一个写入调试器的文本编写器。

using System.Diagnostics;
using System.IO;
using System.Text;

namespace TestConsole
{
    public class DebugTextWriter : TextWriter
    {
        public override Encoding Encoding
        {
            get { return Encoding.UTF8; }
        }

        //Required
        public override void Write(char value)
        {
            Debug.Write(value);
        }

        //Added for efficiency
        public override void Write(string value)
        {
            Debug.Write(value);
        }

        //Added for efficiency
        public override void WriteLine(string value)
        {
            Debug.WriteLine(value);
        }
    }
}

由于它使用Diagnostics.Debug,它将遵循您的编译器设置,以便它应该写入任何输出。此输出也可以在Sysinternals DebugView中看到。

以下是您使用它的方式:

using System;

namespace TestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.SetOut(new DebugTextWriter());
            Console.WriteLine("This text goes to the Visual Studio output window.");
        }
    }
}

如果要在发布模式下编译时在Sysinternals DebugView中查看输出,可以使用写入OutputDebugString API的TextWriter。它看起来像这样:

using System.IO;
using System.Runtime.InteropServices;
using System.Text;

namespace TestConsole
{
    public class OutputDebugStringTextWriter : TextWriter
    {
        [DllImport("kernel32.dll")]
        static extern void OutputDebugString(string lpOutputString);

        public override Encoding Encoding
        {
            get { return Encoding.UTF8; }
        }

        //Required
        public override void Write(char value)
        {
            OutputDebugString(value.ToString());
        }

        //Added for efficiency
        public override void Write(string value)
        {
            OutputDebugString(value);
        }

        //Added for efficiency
        public override void WriteLine(string value)
        {
            OutputDebugString(value);
        }
    }
}

答案 2 :(得分:1)

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

据我所知,你无法将printf输出定向到开发工作室的输出窗口,而不是直接。 [OP强调添加]

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

  1. 调用printf并打印字符串
  2. 调用OuputDebugString()将字符串打印到输出窗口
  3. 你可以做几件事来实现这个目标。首先是编写自己的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 ++中这样做,那么这个方法对你不起作用。 :-)

答案 3 :(得分:1)

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

在我用于开发的每台机器上,我以某种方式配置我的控制台窗口,这恰好使这种方法更好:

  1. 运行cmd.exe
  2. ALT-SPACE,D
  3. 在选项中,启用QuickEdit模式。
  4. 在布局中,将缓冲区高度设置为9999
  5. 点击确定
  6. 退出CMD窗口。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

您可以使用Systems.Diagnostics.Trace类将输出写入“输出”窗口,而不是(或除控制台)之外。它需要一些配置,但它的工作原理。这是你想要的吗?

您还可以按this article添加自己的标签,但我从未尝试过。