Wo wird die Ausgabe von System.Diagnostics.Debug.Write angezeigt?

146

Das folgende C # -Programm (erstellt mit csc hello.cs) wird nur Hello via Console!auf der Konsole und Hello via OutputDebugStringim DebugView-Fenster gedruckt. Ich kann jedoch keinen der System.Diagnostics.*Anrufe sehen. Warum ist das so?

using System;
using System.Runtime.InteropServices;
class Hello {
    [DllImport("kernel32.dll", CharSet=CharSet.Auto)]
    public static extern void OutputDebugString(string message);

    static void Main() {
        Console.Write( "Hello via Console!" );
        System.Diagnostics.Debug.Write( "Hello via Debug!" );
        System.Diagnostics.Trace.Write( "Hello via Trace!" );
        OutputDebugString( "Hello via OutputDebugString" );
    }
}

Sind möglicherweise spezielle Befehlszeilenoptionen erforderlich csc?

Ich verwende Visual Studio für keine meiner Entwicklungen, dies ist reines Kommandozeilenmaterial.

Frerich Raabe
quelle
Wie bei einem Kommentar in einer anderen Antwort erwähnt, kann Microsoft (SysInternals) DebugView verwenden: technet.microsoft.com/en-us/sysinternals/bb896647.aspx
George Birbilis

Antworten:

77

Wie andere bereits betont haben, müssen Hörer registriert sein, um diese Streams lesen zu können. Beachten Sie auch, dass dies Debug.Writenur funktioniert, wenn das DEBUGBuild-Flag gesetzt ist, während Trace.Writees nur funktioniert, wenn das TRACEBuild-Flag gesetzt ist.

Das Setzen der DEBUGund / oder TRACEFlags erfolgt einfach in den Projekteigenschaften in Visual Studio oder indem Sie csc.exe die folgenden Argumente geben

/define:DEBUG;TRACE

Tormod Fjeldskår
quelle
5
Es war nützlich (hatte das nicht erwartet) für mich herauszufinden, dass Debug- und Trace-Objekte dieselben Trace-Listener verwenden. Daher werden sowohl Debug.Write- als auch Trace.Write-Ausgaben an denselben Orten ausgegeben. Dies hängt nur davon ab unter Bedingungen, unter denen sie möglicherweise nicht hingerichtet werden
hello_earth
1
Könnten Sie näher erläutern, unter welchen Bedingungen dies geschieht? Genau in welcher Situation funktioniert ein Debug.Write nicht wie ein trace.write?
Pacerier
2
Dies funktioniert nicht für mich, ich habe Debug- und Trace-Flags in vs Projekteigenschaften gesetzt und verwende Debug.WriteLine, die Zeile wird ausgeführt, aber nichts wird im Ausgabefenster angezeigt, hat jemand andere Ratschläge?
f1wade
114

Während das Debuggen System.Diagnostics.Debug.WriteLineim Ausgabefenster angezeigt wird ( Ctrl+ Alt+ O), können Sie TraceListenerder Debug.ListenersSammlung auch ein hinzufügen , um Debug.WriteLineAufrufe anzugeben, die an anderen Speicherorten ausgegeben werden sollen.

Hinweis: Debug.WriteLineAufrufe werden möglicherweise nicht im Ausgabefenster angezeigt, wenn die Visual Studio-Option "Alle Texte des Ausgabefensters in das Sofortfenster umleiten" im Menü ExtrasOptionenDebuggingAllgemein aktiviert ist . Um " ExtrasOptionenDebuggen " anzuzeigen , aktivieren Sie das Kontrollkästchen neben " ExtrasOptionenAlle Einstellungen anzeigen ".

Boardernin
quelle
4
Ich möchte bestätigen, dass (Strg + Alt + O) das Ausgabefenster beim Debuggen in Visual Studio 2012
Ishikawa
45

Sie müssen ein hinzufügen TraceListener, damit sie in der Konsole angezeigt werden.

TextWriterTraceListener writer = new TextWriterTraceListener(System.Console.Out);
Debug.Listeners.Add(writer);

Sie werden im Debug-Modus auch im Visual Studio-Ausgabefenster angezeigt.

Jason
quelle
2
Anscheinend wird DebugView sowohl .NET Debug.Write () als auch Win32 OutputDebugString () erfassen: technet.microsoft.com/en-us/sysinternals/bb896647
dlchambers
@dlchambers: Ich denke nicht, dass das richtig ist. Diese Seite behauptet Anzeige von OutputDebugString()und (Kernel)DbgPrint().
Mike C
1
@dlchambers: Ich ziehe den Kommentar zurück; Ich habe festgestellt, dass DebugView erfassen kann, Debug.Write() wenn die Erfassungseinstellungen "Global Win32" enthalten - was erfordert, dass es im Admin-Modus ausgeführt wird.
Mike C
10

Zeigen Sie beim Debuggen in Visual Studio das Fenster "Ausgabe" an (Ansicht-> Ausgabe). Es wird dort zeigen.

Klopfen
quelle
6

Die Diagnosemeldungen werden im Ausgabefenster angezeigt.

Andreas Grech
quelle
5

Wenn ich debug.write ("") in den Code schreibe , wird es im " Sofortfenster" ausgegeben , nicht im "Ausgabefenster".

Du kannst es versuchen. Zur Anzeige des Fensters "Sofort" ( DebugFensterSofort ).

kykbr
quelle
2

Die Lösung für meinen Fall lautet:

  1. Klicken Sie mit der rechten Maustaste auf das Ausgabefenster.
  2. Überprüfen Sie die 'Programmausgabe'
Ning Zhu
quelle
0

Für VB.NET gilt Folgendes. Sie müssen "Debuggen" auswählen UND sicherstellen, dass Sie "Debuggen starten". Dies kann durch Drücken erreicht werden F5.

Außerdem zeigt die Console.WriteLine nur Meldungen an, wenn sie in Ihrem Ausgabefenster als "Release" erstellt wird.

Öffnen Sie, wie bereits erwähnt, das Ausgabefenster mit AnsichtAusgabe UND stellen Sie sicher, dass Sie entweder "Erstellen" auswählen, wenn Sie Console.WriteLine-Nachrichten anzeigen möchten, oder "Debug", wenn Sie Debug.WriteLine- oder Trace.WriteLine-Nachrichten anzeigen möchten.

Matthis Kohli
quelle