Gdzie są wyświetlane dane wyjściowe System.Diagnostics.Debug.Write?

147

Poniższy program C # (zbudowany za pomocą csc hello.cs) drukuje tylko Hello via Console!na konsoli iw Hello via OutputDebugStringoknie DebugView. Jednak nie widzę żadnego z System.Diagnostics.*połączeń. Dlaczego?

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

Czy mogą być wymagane jakieś specjalne przełączniki wiersza polecenia csc?

Nie używam Visual Studio do żadnego z moich programów, to jest czysta linia poleceń.

Frerich Raabe
źródło
jak wspomniano w pewnym komentarzu w innej odpowiedzi, można skorzystać z DebugView firmy Microsoft (SysInternals): technet.microsoft.com/en-us/sysinternals/bb896647.aspx
George Birbilis

Odpowiedzi:

77

Jak zauważyli inni, słuchacze muszą być zarejestrowani, aby móc czytać te strumienie. Zauważ również, że Debug.Writebędzie działać tylko wtedy, gdy DEBUGflaga budowania jest ustawiona, natomiast Trace.Writebędzie działać tylko wtedy, gdy TRACEflaga budowania jest ustawiona.

Ustawienie DEBUGi / lub TRACEflagi można łatwo wykonać we właściwościach projektu w programie Visual Studio lub przez dostarczenie następujących argumentów do csc.exe

/define:DEBUG;TRACE

Tormod Fjeldskår
źródło
5
Przydało mi się (nie spodziewałem się tego), że dowiedziałem się, że obiekty Debug i Trace używają tych samych detektorów śledzenia, dlatego zarówno Debug.Write, jak i Trace.Write dane wyjściowe w tym samym miejscu (miejscach), zależy to tylko od pod warunkiem, że mogą nie zostać wykonane
hello_earth,
1
czy mógłbyś wyjaśnić, jakie to warunki ? dokładnie w jakiej sytuacji debug.Write nie będzie działał tak samo jak trace.write?
Pacerier,
2
to nie działa dla mnie, mam ustawione flagi debugowania i śledzenia we właściwościach vs projektu i używam Debug.WriteLine, linia jest wykonywana, ale nic nie pojawia się w oknie wyjściowym, czy ktoś ma inne porady?
f1wade
114

Podczas gdy debugowanie System.Diagnostics.Debug.WriteLinezostanie wyświetlone w oknie danych wyjściowych ( Ctrl+ Alt+ O), możesz również dodać TraceListenerdo Debug.Listenerskolekcji, aby określić Debug.WriteLinewywołania danych wyjściowych w innych lokalizacjach.

Uwaga: Debug.WriteLinewywołania mogą nie być wyświetlane w oknie wyjściowym, jeśli w menu NarzędziaOpcjeDebugowanieOgólne zaznaczono opcję Visual Studio „Przekieruj cały tekst okna wyjściowego do okna bezpośredniego” . Aby wyświetlić „ NarzędziaOpcjeDebugowanie ”, zaznacz pole obok „ NarzędziaOpcjePokaż wszystkie ustawienia ”.

boardernin
źródło
4
Chciałbym potwierdzić, że (Ctrl + Alt + O) spowoduje wyświetlenie okna wyjściowego podczas debugowania w programie Visual Studio 2012
Ishikawa
45

Musisz dodać, TraceListeneraby zobaczyć je na konsoli.

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

Pojawiają się również w oknie danych wyjściowych programu Visual Studio w trybie debugowania.

Jason
źródło
2
Najwyraźniej DebugView przechwyci zarówno .NET Debug.Write (), jak i Win32 OutputDebugString (): technet.microsoft.com/en-us/sysinternals/bb896647
dlchambers
@dlchambers: Nie sądzę, że to prawda. Ta strona twierdzi, że wyświetla OutputDebugString()i (jądro)DbgPrint().
Mike C
1
@dlchambers: Wycofuję komentarz; Odkryłem, że DebugView może przechwytywać, Debug.Write() jeśli jego ustawienia przechwytywania obejmują „Global Win32” - co wymaga uruchomienia go w trybie administratora.
Mike C
10

Podczas debugowania w programie Visual Studio wyświetl okno „Wyjście” (Widok-> Dane wyjściowe). Tam się pokaże.

Poklepać
źródło
6

Komunikaty diagnostyczne są wyświetlane w oknie danych wyjściowych.

Andreas Grech
źródło
5

Kiedy piszę debug.write ("") w kodzie, wyświetla on w "oknie bezpośrednim", a nie "oknie wyjściowym".

Możesz tego spróbować. Do wyświetlania okna „Natychmiastowe” ( DebugujOknoNatychmiastowe ).

kykbr
źródło
2

Rozwiązanie dla mojego przypadku to:

  1. Kliknij prawym przyciskiem myszy okno wyjściowe;
  2. Sprawdź „Wyjście programu”
Ning Zhu
źródło
0

W przypadku VB.NET obowiązują następujące zasady. Musisz wybrać „Debuguj” ORAZ upewnić się, że „Rozpocznij debugowanie”. Można to osiągnąć, naciskając F5.

Również Console.WriteLine będzie wyświetlać komunikaty tylko podczas budowania jako „Release” w oknie Output.

Jak wspomniano wcześniej, otwórz okno Wyjście za pomocą WidokWyjście ORAZ upewnij się, że wybrałeś „Kompiluj”, jeśli chcesz zobaczyć komunikaty Console.WriteLine lub „Debuguj”, jeśli chcesz zobaczyć komunikaty Debug.WriteLine lub Trace.WriteLine.

Matthis Kohli
źródło