Visual Studio:谁在写控制台?

Ben*_*jol 0 debugging console visual-studio

好的,这是一个很好的(我认为) - 我正在开发一个由开发团队创建的具有很多(太多)依赖dll的应用程序.我正在尝试只调试一个程序集,但是控制台输出被Console.WriteLines和Debug.WriteLines左侧分散在代码周围的"污染" .

无论如何,我可以确切地确定给定线路来自哪个组件,所以我可以让作者清理它们的来源?

更新如果您还遇到此类问题,请注意还有另一个潜在的输出消息源,即任何设置为打印消息时设置为'When hit'的断点.说了这个,这是一个非常酷的功能,可以防止我上面遇到的那种问题.

Jon*_*eet 7

是的 - 更换Console.Out.Console.SetOut在创建之后使用TextWriter,不仅将请求的数据转储到原始控制台,还将堆栈跟踪(以及时间戳和请求的数据)转储到文件中.

这里有一些代码,改编自Benjol的答案:

(注意:您需要根据每次写入后或每个写入行后是否需要堆栈跟踪来调整此代码.在下面的代码中,每个char后跟一个堆栈跟踪!)

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

public sealed class StackTracingWriter : TextWriter
{
    private readonly TextWriter writer;

    public StackTracingWriter (string path)
    {
        writer = new StreamWriter(path) { AutoFlush = true };
    }

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

    public override void Write(string value)
    {
        string trace = (new StackTrace(true)).ToString();
        writer.Write(value + " - " + trace);
    }

    public override void Write(char[] buffer, int index, int count)
    {
        Write(new string(buffer, index, count));
    }

    public override void Write(char value)
    {
        // Note that this will create a stack trace for each character!
        Write(value.ToString());
    }

    public override void WriteLine()
    {
        // This is almost always going to be called in conjunction with
        // real text, so don't bother writing a stack trace
        writer.WriteLine();
    }

    protected override void Dispose(bool disposing)
    {
        writer.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

要使用该用于记录都Console.WriteLineDebug.WriteLine to a file你的代码尽早,使这样的电话:

var writer = new StackTracingWriter(@"C:\Temp\ConsoleOut.txt");
Console.SetOut(writer);
Debug.Listeners.Add(new TextWriterTraceListener(writer));
Run Code Online (Sandbox Code Playgroud)

请注意,这当前也不会写入原始控制台.为此,您需要在第二个TextWriter(对于原始控制台)中StackTracingWriter,并且每次都写入两个位置.但是,Debug将继续写入原始控制台.

  • 该死的,Jon Skeet ......你不睡觉吗? (3认同)

Jos*_*osh 6

下载Reflector,您可以打开mscorlib程序集,添加应用程序的程序集,然后右键单击Console类并单击Analyze,您可以显示引用Console类的所有方法.