Classi Trace e Debug

Non è necessario eseguire un'applicazione procedendo una riga alla volta per identificare i problemi. Nello spazio dei nomi Systems.Diagnostics sono incluse le classi Trace e Debug, le quali sono essenzialmente uguali e includono alcuni metodi statici che è possibile utilizzare affinché vengano raccolte informazioni sui percorsi di esecuzione del codice, sulla copertura di codice e perfino sul profiling delle prestazioni. Per entrambe le classi è inoltre disponibile un metodo Assert che consente di verificare una condizione e visualizzare un messaggio se la condizione è false.

Per utilizzare le classi Trace e Debug, eseguire la procedura in tre passaggi riportata di seguito.

  1. Definire il simbolo TRACE o DEBUG.
  2. Creare una nuova istanza del Listener corrispondente.
  3. Aggiungere al codice chiamate alla classe Trace o Debug.

Define — Per consentire il debug e l'analisi, è necessario definire prima il simbolo corrispondente. Questa operazione può essere eseguita in fase di compilazione utilizzando l'opzione di compilazione condizionale /d(efine) per Visual C# (e per le estensioni gestite per C++) o per Visual Basic .NET, come illustrato di seguito:

csc /target:library /debug+ /d:TRACE math.cs
vbc /target:library /debug+ /d:TRACE=True math.vb

È anche possibile definire il simbolo nello stesso codice sorgente, come specificato di seguito:

#define TRACE     // for C# or the Managed Extensions for C++
#Const TRACE=1    ' for Visual Basic .NET

Create — Sia l'output di Debug che quello di Trace vengono acquisiti da un TraceListener. Per impostazione predefinita, l'output viene inviato automaticamente a DefaultTraceListener, che a sua volta lo invia al debugger di sistema di Windows tramite l'API di Windows OutputDebugString e al debugger utilizzando il metodo Debugger.Log. I messaggi inviati tramite Debugger.Log non hanno effetto se non è connesso un debugger.

Se si sta utilizzando il debugger basato su Windows, nella finestra Output verranno visualizzati i messaggi di Debug e Trace. Se invece l'applicazione viene eseguita al di fuori del debugger, ad esempio su un computer per i test, oppure se si desidera salvare le informazioni relative al debug in un file di log in formato testo, è necessario creare un nuovo Listener e aggiungerlo all'insieme Listeners. Nello spazio dei nomi System.Diagnostic sono disponibili i listener EventLogTraceListener e TextWriterTraceListener. Se si desidera creare un file di testo per la gestione dei messaggi di debug, è sufficiente utilizzare la seguente riga di codice:

Trace.Listeners.Add(new 
   TextWriterTraceListener(File.Create("output.txt")));

Add — È possibile infine aggiungere chiamate ai diversi metodi Trace.Write per generare informazioni sul debug in fase di esecuzione, come indicato di seguito:

Trace.WriteLine("");
Trace.WriteLine("Starting tracing...");

Poiché nei primi byte del file di output sono contenute informazioni sulla codifica del testo del file, che non sono leggibili, è possibile iniziare la registrazione su una nuova riga eseguendo un metodo WriteLine vuoto.

L'elemento successivo da considerare è la chiamata a Trace.Indent secondo la quale, per impostazione predefinita, all'output viene applicato un rientro di quattro spazi:

Trace.Indent();

Con le successive chiamate a Trace.Unindent l'output verrà di nuovo allineato a sinistra.

In questo programma di esempio viene utilizzato anche il metodo WriteLineIf di Trace per generare un messaggio di registrazione, ma solo nel caso in cui non si verifichi una determinata condizione. In questo caso particolare, dal codice risulta che la prima immissione numerica inizierà con una cifra diversa da zero. Se il test non viene completato con esito positivo, verrà registrato un messaggio come indicato nella riga seguente:

Trace.WriteLineIf(test == "0", "Oops: Leading zero"); // C#
Trace.WriteLineIf(test = "0", "Oops: Leading zero")   ' VB

In sintesi, l'esecuzione del programma di esempio genera il file Output.txt riportato di seguito.

Starting Tracing...
    InitializeComponent()
        Creating controls
        Setting up Label and TextBox
        Setting up numeric buttons
        Setting up operations buttons
        Adding Clear and Calculate
        Adding to Controls collection
    9 Clicked
    - Clicked
    6 Clicked
    Calculate Clicked
Dispose()

Il funzionamento del metodo Assert è analogo, con la differenza che l'output viene generato sotto forma di finestra di dialogo con i dettagli dell'errore e che il test avrà esito negativo. Il codice del corrispondente metodo Assert è simile a quello riportato di seguito.

Trace.Assert(test != "0", "Oops", "Leading zero"); // C#
Trace.Assert(test <> "0", "Oops", "Leading zero")  ' Visual Basic .NET

Se si esegue Calc.exe e si immette uno zero iniziale, verrà visualizzata la finestra di dialogo illustrata di seguito.

**Nota   **Se l'esecuzione del programma non viene completata, verrà generato un file Output.txt di 0 byte.

Vedere anche

Debug e ottimizzazione | Microsoft CLR Debugger | Debug di applicazioni Web ASP.NET | Appendice A: ulteriori informazioni | Appendice B: debugger di runtime (CorDbg.exe)