Visual Studio:谁在写控制台?

时间:2009-06-12 06:51:15

标签: visual-studio debugging console

好的,这是一个很好的(我认为) - 我正在开发一个由开发团队创建的具有很多(太多)依赖dll的应用程序。我正在尝试只调试一个程序集,但控制台输出被Console.WriteLineDebug.WriteLine散布在代码周围的“{污染”。

无论如何,我可以确切地知道给定行来自哪个汇编,所以我可以让作者清理它们的来源吗?

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

2 个答案:

答案 0 :(得分:7)

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

以下是一些改编自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();
    }
}

要使用此功能记录Console.WriteLineDebug.WriteLine to a file,请在代码中尽早拨打电话:

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

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

答案 1 :(得分:6)

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