Onde a saída System.Diagnostics.Debug.Write aparece?

147

O programa C # a seguir (construído com csc hello.cs) é impresso apenas Hello via Console!no console e Hello via OutputDebugStringna janela DebugView. No entanto, não consigo ver nenhuma das System.Diagnostics.*chamadas. Por que é que?

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

Talvez haja algumas opções especiais de linha de comando necessárias para csc?

Não estou usando o Visual Studio para nenhum dos meus desenvolvimentos, isso é puro material de linha de comando.

Frerich Raabe
fonte
como mencionado em algum comentário em outra resposta, pode usar (SysInternals) DebugView da Microsoft: technet.microsoft.com/en-us/sysinternals/bb896647.aspx
George Birbilis

Respostas:

77

Como outros já apontaram, os ouvintes precisam ser registrados para ler esses fluxos. Observe também que Debug.Writefuncionará apenas se o DEBUGsinalizador de construção estiver definido, enquanto Trace.Writefuncionará apenas se o TRACEsinalizador de construção estiver definido.

A configuração dos sinalizadores DEBUGe / ou TRACEé feita facilmente nas propriedades do projeto no Visual Studio ou fornecendo os seguintes argumentos ao csc.exe

/define:DEBUG;TRACE

Tormod Fjeldskår
fonte
5
Foi útil (não esperava isso) descobrir que os objetos Debug e Trace usam os mesmos ouvintes de rastreamento, portanto, as saídas Debug.Write e Trace.Write no (s) mesmo (s) local (is), é apenas isso dependendo em condições que não pode ter executado
hello_earth
1
você poderia elaborar quais são as condições ? exatamente qual situação um debug.Write não funcionará da mesma maneira que um trace.write?
Pacerier 29/07
2
isso não funciona para mim, eu tenho sinalizadores de depuração e rastreamento definidos nas propriedades do projeto vs e estou usando Debug.WriteLine, a linha é executada, mas nada aparece na janela de saída, alguém tem outro conselho?
F1wade
114

Embora a depuração System.Diagnostics.Debug.WriteLineseja exibida na janela de saída ( Ctrl+ Alt+ O), você também pode adicionar um TraceListenerà Debug.Listenerscoleção para especificar Debug.WriteLinechamadas para saída em outros locais.

Nota: as Debug.WriteLinechamadas podem não ser exibidas na janela de saída se você tiver a opção Visual Studio "Redirecionar todo o texto da Janela de Saída para a Janela Imediata" marcada no menu FerramentasOpçõesDepuraçãoGeral . Para exibir " FerramentasOpçõesDepuração ", marque a caixa ao lado de " FerramentasOpçõesMostrar todas as configurações ".

boardernin
fonte
4
Gostaria de confirmar que (Ctrl + Alt + O) fará com que a janela de saída durante a depuração no Visual Studio 2012
Ishikawa
45

Você precisa adicionar um TraceListenerpara vê-los aparecer no console.

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

Eles também aparecem na janela Saída do Visual Studio quando no modo Debug.

Jason
fonte
2
Aparentemente, o DebugView captura os .NET Debug.Write () e Win32 OutputDebugString (): technet.microsoft.com/en-us/sysinternals/bb896647
dlchambers
@ dlchambers: Eu não acho que isso esteja correto. Essa página alega exibição de OutputDebugString()e (kernel)DbgPrint().
Mike C
1
@ dlchambers: retiro o comentário; Descobri que o DebugView pode capturar Debug.Write() se suas configurações de Captura incluírem "Global Win32" - o que requer executá-lo no modo Admin.
Mike C
10

Enquanto você estiver depurando no Visual Studio, exiba a janela "Saída" (Exibir-> Saída). Vai mostrar lá.

Pat
fonte
6

As mensagens de diagnóstico são exibidas na janela de saída.

Andreas Grech
fonte
5

Quando escrevo debug.write ("") no código, ele sai na "Janela imediata", não na "Janela de saída".

Você pode experimentá-lo. Para exibir a janela "Imediato" ( DepurarJanelaImediato ).

kykbr
fonte
2

A solução para o meu caso é:

  1. Clique com o botão direito na janela de saída;
  2. Verifique a 'Saída do programa'
Ning Zhu
fonte
0

Para o VB.NET, o seguinte se aplica. Você deve selecionar "Depurar" E certifique-se de "Iniciar a depuração". Isso pode ser alcançado pressionando F5.

Além disso, o Console.WriteLine exibirá apenas mensagens ao criar como "Release" na sua janela Output.

Como mencionado anteriormente, abra a janela Saída com ExibirSaída E selecione "Construir" se desejar ver as mensagens do Console.WriteLine ou "Depurar" se desejar ver as mensagens Debug.WriteLine ou Trace.WriteLine.

Matthis Kohli
fonte