2009-06-12 8 views
0

OK, hier ist ein guter (glaube ich) - Ich bin mit viel (viel zu viele) Abhängigkeit dlls, erstellt von einem Team von Entwicklern an einer Anwendung arbeiten. Ich versuche, nur eine Baugruppe zu debuggen, aber die Konsolenausgabe wird von den s und Debug.WriteLine s, die um den Code verstreut sind, 'verschmutzt'.Visual Studio: Wer schreibt auf die Konsole?

Gibt es trotzdem ich genau ausrechnen kann die Baugruppe eine bestimmte Linie herkommt, so kann ich den Autor ihre Quelle zu bereinigen bekommen?

UPDATE Wenn diese Art von Problem auftritt, beachten Sie, dass es eine weitere potenzielle Quelle für Ausgabenachrichten gibt, bei denen es sich um Haltepunkte handelt, die beim Drucken einer Nachricht gesetzt werden. Wenn ich das gesagt habe, ist das ein SEHR cooles Feature, das die Art von Problemen, die ich oben hatte, verhindern kann.

Antwort

7

Ja - ersetzen Console.Out. Verwenden Sie Console.SetOut nach einem TextWriter zu schaffen, die nicht nur die angeforderten Daten an die ursprünglichen Konsole Dumps, sondern Dumps auch einen Stack-Trace (und Zeitstempel und die angeforderten Daten) in eine Datei.

Hier einige Code ist, angepasst von Benjol Antwort:

. (Anmerkung: Sie werden diesen Code je nach anpassen möchten, ob Sie einen Stack-Trace wollen nach jedem schreiben, oder nach jedem Console.WriteLine in dem folgenden Code, jedes Zeichen wird durch einen Stack-Trace gefolgt)

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(); 
    } 
} 

dies sowohl für die Anmeldung Console.WriteLine und Debug.WriteLine to a file, telefonieren wie dies bereits in Ihrem Code wie möglich zu verwenden:

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

Beachten Sie, dass dies derzeit nicht auch auf die ursprüngliche Konsole schreiben. Um dies zu tun, benötigen Sie eine zweite TextWriter (für die ursprüngliche Konsole) in StackTracingWriter, und schreiben Sie jedes Mal an beide Stellen. Debug wird jedoch weiterhin auf der ursprünglichen Konsole geschrieben.

+3

Verdammt, Jon Skeet ... nicht schlafen Sie ?? – Josh

+0

Nur um klar zu sein - das setzt voraus, dass ich Zugriff auf den Anwendungscode habe (was der Fall ist?) Oder ich könnte das auch aus dem Code meiner Assembly heraus tun? – Benjol

+0

Sie können dies von Ihrem eigenen Code aus tun - solange Ihr Code in derselben AppDomain oder demselben Prozess ausgeführt wird (in diesem Fall nicht sicher). Ersetzen Sie Console.Out so kurz wie möglich beim Start und es sollte alle Aufrufe abfangen, die zum Schreiben auf die Konsole erforderlich sind. Möglicherweise möchten Sie auch Console.Error ersetzen. –

6

Herunterladen Reflector und Sie können die Mscorlib Assembly öffnen, fügen Sie die Assemblys Ihrer Anwendung, klicken Sie dann mit der rechten Maustaste auf die Klasse Konsole und klicken Sie auf Analysieren, und Sie können alle Methoden anzeigen, die die Console-Klasse verweisen.

+0

Gute Idee, für den Moment gehe ich mit Jons Idee - einfach weil das Laden von 100+ Baugruppen in Reflector zu sehr nach Arbeit klingt. – Benjol

+1

Es unterstützt Drag & Drop. :) – Josh

+0

Ja, ich denke, ich werde es auch versuchen, das verdanke ich dir zumindest. Ich muss der Versuchung widerstehen, Jon einfach aufzumuntern, weil er immer recht (TM) hat :) – Benjol

Verwandte Themen