Console.WriteLine在Debug中的位置在哪里?

时间:2008-10-30 14:43:00

标签: .net debugging console

我发现this question,但我想知道的是不同的 - Console.WriteLine的输出在调试时是否随处可见?我知道要进入输出窗口我应该调试Debug.WriteLine()或其他方法,但标准的Console.WriteLine()去哪里了?

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

10 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:10)

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

基本上,当第一次调用其中一个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)

NullStream

[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) {
    }
} 

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

对我来说,最好的解决方案是将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 :(得分:1)

我实际上是第二个詹姆斯。

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

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

中描述的方法

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:0)

正如对OP问题的评论:

无需编写其他代码

在Visual Studio的最高菜单中选择

调试> Windows>输出

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

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

答案 8 :(得分:-1)

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

答案 9 :(得分:-4)

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