Où apparaît la sortie System.Diagnostics.Debug.Write?

147

Le programme C # suivant (construit avec csc hello.cs) s'imprime uniquement Hello via Console!sur la console et Hello via OutputDebugStringdans la fenêtre DebugView. Cependant, je ne vois aucun des System.Diagnostics.*appels. Pourquoi donc?

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

Y a-t-il peut-être des commutateurs de ligne de commande spéciaux requis pour csc?

Je n'utilise Visual Studio pour aucun de mes développements, c'est de la pure ligne de commande.

Frerich Raabe
la source
comme mentionné dans un commentaire dans une autre réponse, peut utiliser DebugView de Microsoft (SysInternals): technet.microsoft.com/en-us/sysinternals/bb896647.aspx
George Birbilis

Réponses:

77

Comme d'autres l'ont souligné, les auditeurs doivent être enregistrés pour lire ces flux. Notez également que Debug.Writecela ne fonctionnera que si l' DEBUGindicateur de construction est défini, tandis que Trace.Writene fonctionnera que si l' TRACEindicateur de construction est défini.

La définition des indicateurs DEBUGet / ou TRACEse fait facilement dans les propriétés du projet dans Visual Studio ou en fournissant les arguments suivants à csc.exe

/define:DEBUG;TRACE

Tormod Fjeldskår
la source
5
Il a été utile (je ne m'y attendais pas) de découvrir que les objets Debug et Trace utilisent les mêmes écouteurs de trace, par conséquent, Debug.Write et Trace.Write la sortie au même (s) endroit (s), c'est juste que cela dépend à des conditions qu'ils pourraient ne pas être exécutés
hello_earth
1
pourriez-vous préciser dans quelles conditions ils sont? exactement dans quelle situation un debug.Write ne fonctionnera pas comme un trace.write?
Pacerier du
2
cela ne fonctionne pas pour moi, j'ai des indicateurs de débogage et de trace définis dans les propriétés du projet vs, et j'utilise Debug.WriteLine, la ligne s'exécute, mais rien n'apparaît dans la fenêtre de sortie, quelqu'un a-t-il un autre conseil?
f1wade
114

Alors que le débogage System.Diagnostics.Debug.WriteLines'affichera dans la fenêtre de sortie ( Ctrl+ Alt+ O), vous pouvez également ajouter un TraceListenerà la Debug.Listenerscollection pour spécifier des Debug.WriteLineappels à la sortie dans d'autres emplacements.

Remarque: les Debug.WriteLineappels peuvent ne pas s'afficher dans la fenêtre de sortie si vous avez l'option Visual Studio «Rediriger tout le texte de la fenêtre de sortie vers la fenêtre d'exécution» cochée dans le menu OutilsOptionsDébogageGénéral . Pour afficher « OutilsOptionsDébogage », cochez la case à côté de « OutilsOptionsAfficher tous les paramètres ».

boardernin
la source
4
Je voudrais confirmer que (Ctrl + Alt + O) fera apparaître la fenêtre de sortie lors du débogage dans Visual Studio 2012
Ishikawa
45

Vous devez ajouter un TraceListenerpour les voir apparaître sur la console.

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

Ils apparaissent également dans la fenêtre Sortie de Visual Studio en mode débogage.

Jason
la source
2
Apparemment, DebugView capturera à la fois le .NET Debug.Write () et Win32 OutputDebugString (): technet.microsoft.com/en-us/sysinternals/bb896647
dlchambers
@dlchambers: Je ne pense pas que ce soit correct. Cette page revendique l'affichage de OutputDebugString()et (noyau)DbgPrint().
Mike C
1
@dlchambers: je retire le commentaire; J'ai découvert que DebugView peut capturer Debug.Write() si ses paramètres de capture incluent "Global Win32" - ce qui nécessite de l'exécuter en mode Admin.
Mike C
10

Pendant que vous déboguez dans Visual Studio, affichez la fenêtre «Sortie» (Affichage-> Sortie). Cela montrera là.

Tapoter
la source
6

Les messages de diagnostic s'affichent dans la fenêtre de sortie.

Andreas Grech
la source
5

Lorsque j'écris debug.write ("") dans le code, il sort dans la "Fenêtre immédiate", pas dans la "Fenêtre de sortie".

Tu peux l'essayer. Pour afficher la fenêtre "Immédiat" ( DébogageFenêtreImmédiat ).

kykbr
la source
2

La solution pour mon cas est:

  1. Cliquez avec le bouton droit sur la fenêtre de sortie;
  2. Vérifiez la 'Sortie du programme'
Ning Zhu
la source
0

Pour VB.NET, ce qui suit s'applique. Vous devez sélectionner "Déboguer" ET vous assurer que vous "Démarrer le débogage". Ceci peut être atteint en appuyant sur F5.

De plus, Console.WriteLine affichera uniquement les messages lors de la construction en tant que "Release" dans votre fenêtre de sortie.

Comme mentionné précédemment, ouvrez la fenêtre Sortie avec AffichageSortie ET assurez-vous de sélectionner soit "Construire" si vous voulez voir les messages Console.WriteLine ou "Debug" si vous voulez voir les messages Debug.WriteLine ou Trace.WriteLine.

Matthis Kohli
la source