Visual Studio: кто пишет в консоль? - PullRequest
0 голосов
/ 12 июня 2009

Хорошо, вот хороший (я думаю) - я работаю над приложением с множеством (слишком много) зависимых библиотек, созданным командой разработчиков. Я пытаюсь отладить только одну сборку, но вывод консоли «загрязнен» Console.WriteLine s и Debug.WriteLine s, разбросанными вокруг кода.

Есть ли в любом случае, я могу точно определить, из какой сборки происходит данная строка, чтобы я мог заставить автора очистить их источник?

ОБНОВЛЕНИЕ Если вы также столкнулись с подобной проблемой, обратите внимание, что существует другой потенциальный источник выходных сообщений - любые точки останова с установленным параметром «Когда» для печати сообщения. Сказав это, это ОЧЕНЬ крутая функция, которая может предотвратить проблемы, которые у меня были выше.

Ответы [ 2 ]

7 голосов
/ 12 июня 2009

Да - заменить Console.Out. Используйте Console.SetOut после создания TextWriter, который не только выводит запрошенные данные на исходную консоль, но также выводит трассировку стека (и метку времени, и запрошенные данные) в файл.

Вот код, адаптированный из ответа Бенджола:

(Примечание: вы захотите адаптировать этот код в зависимости от того, хотите ли вы использовать трассировку стека после каждой записи или после каждой записи. В приведенном ниже коде за каждым символом следует трассировка стека!) *

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.WriteLine, так и Debug.WriteLine to a file, совершайте такие звонки как можно раньше в своем коде:

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

Обратите внимание, что в настоящее время не также не записывает данные в исходную консоль. Для этого вам потребуется секунда TextWriter (для исходной консоли) в StackTracingWriter и каждый раз записывать в оба места. Однако отладка будет продолжать записываться на исходную консоль.

6 голосов
/ 12 июня 2009

Загрузка Отражатель , и вы можете открыть сборку mscorlib, добавить сборки вашего приложения, затем щелкнуть правой кнопкой мыши на классе консоли и нажать Анализ, и вы можете показать все методы, которые ссылаются на класс консоли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...