Gravando na janela de saída do Visual Studio


605

Estou tentando escrever uma mensagem na janela de saída para fins de depuração. Eu procurei por uma função como a de Java system.out.println(""). Eu tentei Debug.Write, Console.Writee Trace.Write. Não apresenta um erro, mas também não imprime nada.

As opções "Definir constante DEBUG" e "Definir constante TRACE" estão marcadas.

Ferramentas do menu → OpçõesDepuração → A opção "Redirecionar todo o texto da janela de saída para a janela imediata" não está marcada.

Configuração: Ativo (Depuração)

Nota: Criei um projeto com o assistente como "Aplicativo Windows Forms", se relevante. Não faço ideia para onde procurar.


32
tentar usarDebug.WriteLine()
Nikson Kanti Paul

9
Como este é um post antigo, adicionarei isso como um comentário para aqueles que se deparam com a pergunta. Em vez de realmente alterar o código, você também pode usar pontos de interrupção especiais chamados pontos de rastreamento. Consulte a documentação do MSDN
Wonko the Sane

13
Apenas um lembrete de que Debug.WriteLine () funcionará apenas quando executado no Debug. Isso significa executá-lo com F5 e não com CTRL-F5. Isso é fácil de perder.
kirk.burleson

3
Isso é verdade, mas uma ferramenta útil é DebugView que mostra todas as saídas para o fluxo de depuração quando executado fora do depurador
the_mandrill

2
Se você estiver tentando gravar a saída de um teste de unidade em execução na estrutura de teste do Visual Studio, as regras são um pouco diferentes, consulte esta resposta para obter detalhes.
yoyo

Respostas:


754

Adicione o System.Diagnosticsespaço para nome e, em seguida, você pode usar Debug.WriteLine()para imprimir rapidamente uma mensagem na janela de saída do IDE. Para mais detalhes, consulte estes:


2
Obrigado. Presumo que não há como gravar na saída se eu começar sem depurar (ctrl-f5), certo?
previous_developer

1
Eu acho que você está procurando por isso: stackoverflow.com/questions/562590/…
Bhargav Bhat 27/12/12

Obrigado novamente, mas isso não funcionou para mim. O rastreamento não é impresso sem o modo de depuração, mesmo que a constante TRACE esteja definida.
previous_developer

Acabei de executar um pequeno aplicativo aqui, funciona bem para mim. Talvez haja uma pequena falha no seu ambiente?
Bhargav Bhat

1
Este é o meu código de teste; pastebin.com/b7P0bYEa É bem simples, mas ainda nada. Vou tentar em outro sistema.
previous_developer

154

Isso gravará na janela de saída de depuração:

using System.Diagnostics;

Debug.WriteLine("Send to debug output.");

6
Para mim, este "saídas" para a janela imediata
nuander

Eu tentei isso em um conjunto de testes de unidade. Depurei o teste selecionado, mas não havia nada do que tentei imprimir na janela de depuração.
22715 Frank H.

Isso gera saída para a janela Debug, no entanto, somente depois que eu fecho a página da web. Gostaria de uma exibição imediata ao executar o código. Espere um minuto - descobri que a janela de saída está oculta enquanto o código está em execução. Se eu exibir a janela, minha saída estará lá.
Joe Cotton

Podemos manter um log dessa mensagem impressa na janela de depuração? ou o visual studio fornece alguma maneira de acessar os logs da janela de depuração ..?
Anmol Rathod

82

Usar:

System.Diagnostics.Debug.WriteLine("your message here");

55
Debug.WriteLine

é o que você está procurando.

Caso contrário, tente fazer o seguinte:

Ferramentas do menu → OpçõesDepuração → desmarque Enviar saída para imediato .


1
Possivelmente, Debug.Write () não está inserindo o retorno de carro, então as mensagens estão ficando em buffer?
27612 Guy Starbuck

2
Eu não estava vendo o Debug.WriteLine ("String") até depois de fazer o que Micah disse. Tools|Options|Debugging uncheck Send Output to Immediate
Skindeep2366

3
Acho que nas versões posteriores a caixa de seleção é "Redirecionar todo o texto janela de saída para janela imediata"
Houdini Sutherland

6
no VS 2015, ele se chama: "Redirecione todo o texto da janela de saída para a janela imediata", apenas para o caso de alguns terem que procurar 5 minutos para encontrar a configuração apropriada :) - eu estava rolando para cima e para baixo para encontrar uma opção começando com " Send ... ":)
dba

22

Para mim, apenas o namespace Trace e não o Debug funcionaram:

System.Diagnostics.Trace.WriteLine("message");

Estou trabalhando em um projeto C # no Visual Studio 2010.


2
Estou usando o VS 2013 Professional e tentando obter saída de um teste de unidade usando a estrutura de teste de unidade do Visual Studio. Parece que o equipamento de teste captura e redireciona Debug.WriteLine, mas não Trace.WriteLine. E você também não verá a saída Trace, a menos que depure os testes (não apenas execute-os).
yoyo

15

Você pode estar procurando

MessageBox.Show()

ou

Debug.Writeline()

8
MessageBox.Show()pode ser muito irritante quando você deseja gravar vários valores para fins de depuração.
Dementic

4
A pergunta era "Escrevendo na janela de saída do Visual Studio?" não para uma caixa de mensagem.
Amir Touitou

@AmirTwito Uma caixa de mensagem é uma janela de saída.
ProfK

4
Sim, você está certo, mas a pergunta era "Escrevendo na janela de saída do Visual Studio?" e não para uma caixa de mensagem simples usando este código: MessageBox.Show ()
Amir Touitou

4
@ProfK A janela de saída do Visual Studio é um elemento da GUI muito específico do programa específico e MessageBox.Shownão grava nele.
jpmc26

9

A chamada

System.Diagnostics.Debug.WriteLine("message");

falha ao trabalhar com o .NET Core (V 1.0 ou 1.1).

Deveríamos criar e usar um logger de Microsoft.Extensions.Logging, mas esse log aparece apenas na janela do console pop-up do dotnet.exe, não na janela Saída do Visual Studio.


Portanto, Debug.WriteLine (), Console.WriteLine () e Trace.WriteLine () não estão produzindo nada no Output for .Net Core? Alguma maneira de usar algum tipo de log simples sem precisar escrever uma classe de log? Pesquisei em Ferramentas> Opções> Depuração e verifique o "Mostrar saída de:" para possíveis soluções.
Wouter Vanherck

4

Isso requer uma estrutura de terceiros, ou seja, o Serilog , mas mesmo assim achei uma experiência muito tranquila com a obtenção de saída para algum lugar que eu possa ver.

Você primeiro precisa instalar o coletor Trace do Serilog . Depois de instalado, você precisa configurar o logger da seguinte maneira:

Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.Trace()
    .CreateLogger();

(Você pode definir um nível mínimo diferente ou defini-lo como um valor de configuração ou qualquer uma das funcionalidades normais do Serilog. Você também pode definir o criador de Tracelogs para um nível específico para substituir as configurações, ou como desejar.)

Então você apenas registra as mensagens normalmente e elas são exibidas na janela Saída:

Logger.Information("Did stuff!");

Isso não parece tão importante, então deixe-me explicar algumas vantagens adicionais. O maior para mim foi o fato de eu poder fazer logon simultaneamente na janela Saída e no console :

Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.Trace()
    .WriteTo.Console(standardErrorFromLevel: LogEventLevel.Error)
    .CreateLogger();

Isso me deu uma grande flexibilidade em termos de como eu consumi a saída, sem ter que duplicar todas as minhas chamadas Console.Writecom Debug.Write. Ao escrever o código, eu poderia executar minha ferramenta de linha de comando no Visual Studio sem medo de perder minha saída quando ela saísse. Quando eu o implantei e precisei depurar algo (e não tinha o Visual Studio disponível), a saída do console estava prontamente disponível para o meu consumo. As mesmas mensagens também podem ser registradas em um arquivo (ou qualquer outro tipo de coletor) quando estiver sendo executado como uma tarefa agendada.

O ponto principal é que o uso do Serilog para isso facilitou o despejo de mensagens para vários destinos, garantindo que eu sempre pudesse acessar prontamente a saída, independentemente de como a executei.

Também requer configuração e código mínimos.


1
O Serilog agora também possui um coletor de "depuração" em github.com/serilog/serilog-sinks-debug que funciona de maneira semelhante, mas possui uma formatação um pouco melhor :-) HTH!
Nicholas Blumhardt

Por que não tornar um método público .net (pode ser estático) e colocar lá tudo o que você precisa, como Console.Write ou Debug.Write etc, e usá-lo em qualquer lugar?
Saulius

@Saulius "As mesmas mensagens também podem ser registradas em um arquivo (ou em qualquer outro tipo de coletor) quando estão sendo executadas como uma tarefa agendada. A conclusão é que o uso do Serilog para fazer isso facilitou o envio de mensagens para vários destinos, garantindo que eu sempre possa acessar prontamente a saída, independentemente de como a executei. "
Jpmc26

1

Esta não é uma resposta para a pergunta original. Mas como encontrei essa pergunta ao procurar um meio de despejar interativamente dados de objetos, imaginei que outros poderiam se beneficiar ao mencionar essa alternativa muito útil.

Eu finalmente usei a janela de comando e digitei o Debug.Printcomando, como mostrado abaixo. Isso imprimiu um objeto de memória em um formato que pode ser copiado como texto, o que é tudo o que eu realmente precisava.

> Debug.Print <item>

  id: 1
  idt: null
  igad: 99
  igbd: 99
  gl_desc: "New #20"
  te_num: "1-001-001-020"


0

O seguinte funcionou para mim no Visual Studio 2015:

OutputDebugStringW(L"Write this to Output window in VS14.");

Leia a documentação para OutputDebugStringW aqui .

insira a descrição da imagem aqui Observe que esse método só funciona se você estiver depurando seu código ( debug mode)


11
Isso é C ++? A pergunta está marcada com c # .
precisa saber é o seguinte

0

Para fins de depuração, o System.Diagnostics.Debug.Writeline()comando não será compilado na versão do código, a menos que você tenha ouvintes de depuração. Ele grava em todos os ouvintes de rastreamento, que incluem a janela de saída do VS ao executar no modo Debug.

Para um aplicativo de console. Console.Writeline()funcionaria, mas a saída ainda seria gerada na versão de lançamento do seu binário.

A saída de depuração também deve aparecer na janela de saída normal ao depurar testes; enquanto que a saída console.writeline não existe (mas pode ser encontrada na janela de saída de teste).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.