【问题标题】:Capture console output for debugging in VS?捕获控制台输出以在 VS 中进行调试?
【发布时间】:2008-09-23 18:22:04
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# visual-studio debugging


    【解决方案1】:

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

    我手边没有VS,所以这是凭记忆:

    1. 创建 C++ 项目
    2. 打开项目设置、调试选项卡
    3. 启用托管调试
    4. 编辑命令行以添加“> output.txt
    5. 在调试器下运行程序

    如果事情按照我记得的方式运行,这会将 STDOUT 重定向到文件,即使您实际上并未在 CMD.EXE 下运行。

    (调试器有自己的重定向语法实现,和cmd不是100%一样,但是已经很不错了。)

    现在,如果您在 VS 中打开此文件,您仍然可以在 VS 中看到输出,尽管与您希望的窗口不完全相同。

    【讨论】:

      【解决方案2】:

      控制台可以将其输出重定向到任何文本编写器。如果您实现了一个写入 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);
              }
          }
      }
      

      【讨论】:

        【解决方案3】:

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

        据我所知,您不能将 printf 输出直接输出到 dev studio 的输出窗口,无论如何也不能直接输出。 [强调由 OP 添加]

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

        1. 调用 printf 并打印字符串
        2. 调用 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++ 中执行此操作,那么此方法将不适合您。 :-)

        【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • +1 用于配置控制台窗口。我会将窗口大小的高度设置为 50。
        【解决方案5】:

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

        【讨论】:

        • 我正在寻找无需修改执行输出的代码即可工作的东西。
        【解决方案6】:

        您可以使用 Systems.Diagnostics.Trace 类将您的输出写入输出窗口,而不是(或除了)控制台。它需要一些配置,但它可以工作。是否符合您的要求?

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

        【讨论】:

        • 那个链接也不是。碎屑。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-06
        • 2020-01-04
        • 1970-01-01
        • 2014-08-15
        • 2020-07-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多