¿Dónde aparece la salida System.Diagnostics.Debug.Write?

147

El siguiente programa C # (construido con csc hello.cs) imprime solo Hello via Console!en la consola y Hello via OutputDebugStringen la ventana DebugView. Sin embargo, no puedo ver ninguna de las System.Diagnostics.*llamadas. ¿Porqué es eso?

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

¿Tal vez se requieren algunos interruptores especiales de línea de comandos csc?

No estoy usando Visual Studio para ninguno de mis desarrollos, esto es puro material de línea de comandos.

Frerich Raabe
fuente
como se menciona en algún comentario en otra respuesta, puede usar DebugView de Microsoft (SysInternals): technet.microsoft.com/en-us/sysinternals/bb896647.aspx
George Birbilis

Respuestas:

77

Como otros han señalado, los oyentes deben estar registrados para poder leer estas transmisiones. También tenga en cuenta que Debug.Writesolo funcionará si se DEBUGestablece el indicador de compilación, mientras Trace.Writeque solo funcionará si se TRACEestablece el indicador de compilación.

La configuración de los indicadores DEBUGy / o TRACEse realiza fácilmente en las propiedades del proyecto en Visual Studio o al proporcionar los siguientes argumentos a csc.exe

/define:DEBUG;TRACE

Tormod Fjeldskår
fuente
55
Fue útil (no esperaba eso) para mí descubrir que los objetos Debug y Trace usan los mismos oyentes de rastreo, por lo tanto, Debug.Write y Trace.Write salen en el mismo lugar (s), es solo eso dependiendo en condiciones que no pudieron conseguir ejecutada
hello_earth
1
¿Podría explicar en qué condiciones están? exactamente qué situación una depuración. ¿Escribir no funcionará igual que trace.write?
Pacerier
2
esto no funciona para mí, tengo marcas de depuración y rastreo establecidas en las propiedades del proyecto, y estoy usando Debug.WriteLine, la línea se ejecuta, pero no aparece nada en la ventana de salida, ¿alguien recibió algún otro consejo?
f1wade
114

Si bien la depuración System.Diagnostics.Debug.WriteLinese mostrará en la ventana de salida ( Ctrl+ Alt+ O), también puede agregar un TraceListenera la Debug.Listenerscolección para especificar Debug.WriteLinellamadas a la salida en otras ubicaciones.

Nota: es Debug.WriteLineposible que las llamadas no se muestren en la ventana de salida si tiene la opción de Visual Studio "Redirigir todo el texto de la ventana de salida a la ventana Inmediato" marcada en el menú HerramientasOpcionesDepuraciónGeneral . Para mostrar " HerramientasOpcionesDepuración ", marque la casilla junto a " HerramientasOpcionesMostrar todas las configuraciones ".

boardernin
fuente
44
Me gustaría confirmar que (Ctrl + Alt + O) mostrará la ventana de salida durante la depuración en Visual Studio 2012
Ishikawa
45

Debe agregar un TraceListenerpara verlos aparecer en la consola.

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

También aparecen en la ventana de resultados de Visual Studio cuando están en modo de depuración.

jason
fuente
2
Aparentemente, DebugView capturará .NET Debug.Write () y Win32 OutputDebugString (): technet.microsoft.com/en-us/sysinternals/bb896647
dlchambers
@dlchambers: no creo que sea correcto. Esa página dice que muestra OutputDebugString()y (kernel)DbgPrint().
Mike C
1
@dlchambers: retiro el comentario; Descubrí que DebugView puede capturar Debug.Write() si su configuración de captura incluye "Global Win32", lo que requiere ejecutarlo en modo Admin.
Mike C
10

Mientras está depurando en Visual Studio, visualice la ventana "Salida" (Ver-> Salida). Se mostrará allí.

Palmadita
fuente
6

Los mensajes de diagnóstico se muestran en la ventana de salida.

Andreas Grech
fuente
5

Cuando escribo debug.write ("") en el código, en la "Ventana inmediata", no en la "Ventana de salida".

Puedes probarlo. Para mostrar la ventana "Inmediato" ( DepuraciónVentanaInmediato ).

kykbr
fuente
2

La solución para mi caso es:

  1. Haga clic derecho en la ventana de salida;
  2. Verifique la 'Salida del programa'
Ning Zhu
fuente
0

Para VB.NET se aplica lo siguiente. Debe seleccionar "Depurar" Y asegurarse de que "Iniciar depuración". Esto se puede alcanzar presionandoF5 .

Además, Console.WriteLine solo mostrará mensajes al compilar como "Release" en su ventana de Salida.

Como se mencionó anteriormente, abra la ventana Salida con VerSalida Y asegúrese de seleccionar "Construir" si desea ver los mensajes Console.WriteLine o "Depurar" si desea ver los mensajes Debug.WriteLine o Trace.WriteLine.

Matthis Kohli
fuente