【问题标题】:Where does Console.WriteLine go in Debug?Console.WriteLine 在哪里调试?
【发布时间】:2008-10-30 14:42:59
【问题描述】:

我找到了this question,但我想知道的是不同的 - Console.WriteLine 的输出在调试时会去任何地方吗?我知道要让它进入输出窗口我应该 Debug.WriteLine() 或其他方法,但是标准的 Console.WriteLine() 去哪里了?

编辑 调试时,您看不到黑色控制台窗口/测试日志 - 所以真正的问题是如何在调试期间访问/查看此输出?

【问题讨论】:

  • 在 Visual Studio 最上面的菜单中选择“调试”>“窗口”>“输出”。当您找到它们时,它会显示所有Console.WriteLine("Debug MyVariable: " + MyVariable)。之前设置断点,调试,然后使用F11逐行单步执行代码。

标签: .net debugging console


【解决方案1】:

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

【讨论】:

  • "它会遵循你的编译器设置来决定它是否应该写任何输出"输出去哪里?
  • @jpaugh Diagnostics.Debug 在调试时写入 Visual Studio 中的“输出”窗口。发布编译通常会删除 Debug 语句。
【解决方案2】:

NullStream,定义为“没有后备存储的流”。所有的方法什么都不做或什么也不返回。它是Stream 的内部类。以下代码取自微软的源代码。

基本上,当第一次调用Console 写入方法之一时,会调用Windows API 函数GetStdHandle 以获取“标准输出”。如果没有返回句柄,则创建并使用 NullStream

Samuel 的回答是正确的,并提供了一般信息。要实际重定向控制台输出,无论项目类型如何,请使用Console.SetOut(New System.IO.StreamWriter("C:\ConsoleOutput.txt")),这是一个简单的示例。

将控制台、调试和跟踪定向到文件

直接回答您的问题。使用ConsoleTraceListenerStreamWriter 将所有三个输出定向到一个文件。我仅将以下内容用于开发。

    Dim oLogFile As New System.IO.StreamWriter("C:\ConsoleOutput.txt")
    oLogFile.AutoFlush = True 'so we do not have to worry about flushing before application exit

    Console.SetOut(oLogFile)

    'note, writing to debug and trace causes output on console, so you will get double output in log file
    Dim oListener As New ConsoleTraceListener
    Debug.Listeners.Add(oListener)
    Trace.Listeners.Add(oListener)

空流

[Serializable]
private sealed class NullStream : Stream {
    internal NullStream() { }

    public override bool CanRead {
        get { return true; }
    }

    public override bool CanWrite {
        get { return true; }
    }

    public override bool CanSeek {
        get { return true; }
    }

    public override long Length {
        get { return 0; }
    }

    public override long Position {
        get { return 0; }
        set { }
    }

    // No need to override Close

    public override void Flush() {
    }

    public override int Read([In, Out] byte[] buffer, int offset, int count) {
        return 0;
    }

    public override int ReadByte() {
        return -1;
    }

    public override void Write(byte[] buffer, int offset, int count) {
    }

    public override void WriteByte(byte value) {
    }

    public override long Seek(long offset, SeekOrigin origin) {
        return 0;
    }

    public override void SetLength(long length) {
    }
} 

【讨论】:

    【解决方案3】:

    对我来说最好的解决方案是将 Console.WriteLine() 更改为 System.Diagnostics.Debug.WriteLine()。 例如:

     catch (DbEntityValidationException dbEx)
     {
        foreach (var validationErrors in dbEx.EntityValidationErrors)
        {
           foreach (var validationError in validationErrors.ValidationErrors)
           {
              System.Diagnostics.Debug.WriteLine("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
           }
        }
    

    然后您可以在输出窗口中将您的错误视为一个对象。

    【讨论】:

      【解决方案4】:

      调试和发布不控制您是否获得控制台窗口。这由项目的输出类型控制。 (属性 -> 应用程序 -> 输出类型)。 控制台应用程序将为您提供一个控制台窗口,该窗口将可视化并接收来自窗口的输入到 System.Console 中的错误、输入和输出流中。

      System.Console 类公开了几个属性和方法,用于与其流交互,即使您看不到它。最值得注意的是:Error、In、Out、SetError()、SetIn()、SetOut() 以及 Read 和 Write 方法。

      【讨论】:

        【解决方案5】:

        我实际上会在这个问题上支持詹姆斯。

        http://www.csharp411.com/console-output-from-winforms-application

        对其进行了详细描述(如果将输出定向到文件就足够了,那么您可以轻松使用 amissico 的方法)。他们描述的大多数方法都模仿http://dslweb.nwnexus.com/~ast/dload/guicon.htm中描述的方法

        如前所述,将您的项目更改为“控制台”项目会产生类似的效果。干杯!

        【讨论】:

          【解决方案6】:

          Visual Studio 启动 Windows 程序 (/target:winexe),并将 stdin/stdout/stderr重定向到命名管道。每个管道的另一端归 VS 调试器所有,在 stderr/stdout 上读取的任何内容都显示在调试输出窗口中。因此,Console.Write 自动神奇地出现在 VS 调试输出中。请注意,如果您 附加 到已启动的进程,则不会发生这种情况(因为重定向技巧只能在进程启动时完成)。

          在启动控制台程序 (/target:exe) 时,不会发生此重定向,因此 Console.Write 会转到实际控制台(或重定向 stdout 的任何地方)。

          我找不到任何记录此行为的内容,这只是我调查 VS 如何启动和调试应用程序的结论。

          【讨论】:

          • 似乎 VS2019 将 STDOUT 重定向到“即时窗口”。
          【解决方案7】:

          它进入控制台(标准输出)或控制台设置的流。

          【讨论】:

          • 我认为这就是问题所要问的,'什么控制台','控制台在哪里'?
          【解决方案8】:

          正如已经对 OP 的问题发表的评论:

          无需编写额外代码

          在 Visual Studio 最上面的菜单中选择

          调试 > 窗口 > 输出

          输出窗口仅在调试模式下可见,它将显示所有例如 Console.WriteLine("Debug MyVariable: " + MyVariable) 当你找到他们时。

          在之前设置断点(单击所选行开头的行号之前的不同颜色的空白区域),调试(F5),然后逐行执行代码(F11)直到你这样做。

          【讨论】:

            【解决方案9】:

            即使在 WinForms 应用程序中,您也可以创建控制台窗口,但您必须通过 P/Invoke 才能直接调用 Win32 方法。见http://pinvoke.net/default.aspx/kernel32/AllocConsole.html

            【讨论】:

              【解决方案10】:

              Console.writeline() 转到控制台窗口:黑色命令/dos 提示符。

              【讨论】:

                猜你喜欢
                • 2011-08-08
                • 2010-09-13
                • 1970-01-01
                • 1970-01-01
                • 2023-04-10
                • 1970-01-01
                • 1970-01-01
                • 2011-12-02
                相关资源
                最近更新 更多