Modalità di analisi e debug in Visual C#

Per la versione di Microsoft Visual Basic .NET di questo articolo, vedere
313417 .
In questo articolo si riferisce al seguente spazio dei nomi Microsoft.NET Framework Class Library:
  • System.Diagnostics

IN QUESTA ATTIVITÀ

Riepilogo

In questo articolo viene descritto come utilizzare le classi Trace e Debug . Queste classi sono disponibili nel framework .NET di Microsoft. È possibile utilizzare queste classi per fornire informazioni sulle prestazioni di un'applicazione durante lo sviluppo o dopo la distribuzione nell'ambiente di produzione. Queste classi sono solo una parte degli strumenti disponibili nel framework .NET.


Torna all'inizio

Requisiti

Nell'elenco seguente sono indicati l'hardware consigliato, il software, l'infrastruttura di rete e i service pack necessari:
  • Microsoft Windows 2000 o Microsoft Windows XP o Microsoft Windows Server 2003
  • Microsoft Visual C#
In questo articolo si presuppone che si abbia familiarità con il debug dei programmi.

Torna all'inizio

Descrizione della tecnica


I passaggi nella sezione creare un campione con la classe Debugviene illustrato come creare un'applicazione console che utilizza la classe Debug per fornire informazioni sull'esecuzione del programma.


Quando si esegue il programma, è possibile utilizzare i metodi della classe Debug per produrre messaggi che consentono di monitorare la sequenza di esecuzione di programma, il rilevamento dei malfunzionamenti o per fornire informazioni sulle prestazioni. Per impostazione predefinita, i messaggi generati dalla classe Debug vengono visualizzati nella finestra di output dell'ambiente di sviluppo integrato (IDE) di Visual Studio.

Nell'esempio di codice viene utilizzato il metodo WriteLine per produrre un messaggio seguito da un terminatore di riga. Quando si utilizza questo metodo per produrre un messaggio, ciascun messaggio viene visualizzato in una riga separata nella finestra di output.

Quando si utilizza il metodo Assert della classe Debug , la finestra di output visualizza un messaggio solo se una condizione specificata restituisce false. Il messaggio viene visualizzato anche nella finestra di dialogo modale per l'utente. Nella finestra di dialogo sono inclusi il messaggio, il nome del progetto e il numero dell'istruzione Assert . Nella finestra di dialogo sono inclusi inoltre i tre pulsanti seguenti:
  • Abort: L'applicazione viene arrestata.
  • Riprova: Nell'applicazione viene attivata la modalità di debug.
  • Ignora: Continua l'esecuzione dell'applicazione ignorando l'errore.
L'utente deve fare clic su uno di questi pulsanti per procedere con l'esecuzione.

È anche possibile indirizzare l'output della classe Debug a destinazioni diverse dalla finestra di output. La classe Debug dispone di un insieme denominato di listener che include gli oggetti Listener .

Ogni oggetto Listener controlla l'output di Debug e lo indirizza a una destinazione specificata.


Ogni Listener nell'insieme di Listener ricevere qualsiasi output che genera la classe Debug . Utilizzare la classe TextWriterTraceListener per definire gli oggetti Listener . È possibile specificare la destinazione per una classe TextWriterTraceListener tramite il relativo costruttore.

Di seguito sono elencate alcune destinazioni di output possibili:
  • La finestra di Console utilizzando la proprietà System.Console.Out .
  • File di testo (txt) utilizzando l'istruzione System.IO.File.CreateText("FileName.txt") .
Dopo aver creato un oggetto TextWriterTraceListener , è necessario aggiungere l'oggetto all'insieme Listeners di ricevere l'output di Debug.

Torna all'inizio

Creare un esempio con la classe Debug

  1. Avviare Visual Studio o Visual C# Express Edition.
  2. Creare un nuovo progetto applicazione Console Visual C# denominato conInfo. In Visual Studio .NET viene creato Class1. Program.cs viene creato in Visual Studio 2005.
  3. Aggiungere lo spazio dei nomi seguente all'inizio di Class1 o Program.cs.
    using System.Diagnostics;
  4. Per inizializzare variabili contenenti informazioni su un prodotto, aggiungere le seguenti istruzioni di dichiarazione di metodo Main :
    string sProdName = "Widget";int iUnitQty = 100;
    double dUnitCost = 1.03;
  5. Specificare il messaggio che genera la classe come primo parametro di input del metodo WriteLine . Premere la combinazione di tasti CTRL + ALT + O per assicurarsi che sia visibile nella finestra di Output.
    Debug.WriteLine("Debug Information-Product Starting ");
  6. Per migliorare la leggibilità, utilizzare il metodo di rientro per il rientro dei messaggi successivi nella finestra di Output:
    Debug.Indent();
  7. Per visualizzare il contenuto delle variabili selezionate, utilizzare il metodo WriteLine come segue:
    Debug.WriteLine("The product name is " + sProdName);Debug.WriteLine("The available units on hand are" + iUnitQty.ToString());
    Debug.WriteLine("The per unit cost is " + dUnitCost.ToString());
  8. È inoltre possibile utilizzare il metodo WriteLine per visualizzare lo spazio dei nomi e il nome della classe per un oggetto esistente. Ad esempio, il codice seguente visualizza lo spazio dei nomi System.Xml.XmlDocument nella finestra di Output:
    System.Xml.XmlDocument oxml = new System.Xml.XmlDocument();Debug.WriteLine(oxml);
  9. Per organizzare l'output, è possibile includere un parametro di categoria come facoltativo, secondo input del metodo WriteLine . Se si specifica una categoria, il formato del messaggio finestra di Output è "categoria: messaggio." Ad esempio, la prima riga di codice riportato di seguito visualizza "campo: il nome del prodotto sarà Widget" nella finestra di Output:
    Debug.WriteLine("The product name is " + sProdName,"Field");Debug.WriteLine("The units on hand are" + iUnitQty,"Field");
    Debug.WriteLine("The per unit cost is" + dUnitCost.ToString(),"Field");
    Debug.WriteLine("Total Cost is " + (iUnitQty * dUnitCost),"Calc");
  10. Nella finestra di Output è possibile visualizzare i messaggi solo se una determinata condizione viene valutata true utilizzando il metodo WriteLineIf della classe Debug . La condizione da valutare è il primo parametro di input del metodo WriteLineIf . Il secondo parametro di WriteLineIf è il messaggio che viene visualizzato solo se la condizione nel primo parametro restituisce true.
    Debug.WriteLineIf(iUnitQty > 50, "This message WILL appear");Debug.WriteLineIf(iUnitQty < 50, "This message will NOT appear");

  11. Utilizzare il metodo della classe Debug Assert in modo che la finestra di Output viene visualizzato il messaggio solo se una condizione specificata restituisce false:
    Debug.Assert(dUnitCost > 1, "Message will NOT appear");Debug.Assert(dUnitCost < 1, "Message will appear since dUnitcost < 1 is false");

  12. Creare gli oggetti TextWriterTraceListener della finestra di Console (tr1) e per un file di testo denominato output. txt (tr2) e quindi aggiungere ogni oggetto all'insieme di Listener di Debug :
    TextWriterTraceListener tr1 = new TextWriterTraceListener(System.Console.Out);Debug.Listeners.Add(tr1);

    TextWriterTraceListener tr2 = new TextWriterTraceListener(System.IO.File.CreateText("Output.txt"));
    Debug.Listeners.Add(tr2);
  13. Per migliorare la leggibilità, utilizzare il metodo Riduci rientro per rimuovere il rientro per i successivi messaggi che il
    Genera classe debug . Quando si utilizzano insieme metodi Riduci rientro e rientro , il Visualizzatore potrà distinguere l'output come gruppo.
    Debug.Unindent();Debug.WriteLine("Debug Information-Product Ending");
  14. Per assicurarsi che ogni oggetto Listener riceva tutti i relativi output, chiamare il metodo Flush per i buffer di classe Debug :
    Debug.Flush();
Torna all'inizio

Utilizzando la classe Trace

È inoltre possibile utilizzare la classe Trace per produrre messaggi che controllano l'esecuzione di un'applicazione. Le classi Trace e Debug condividono la maggior parte degli stessi metodi per produrre l'output, inclusi i seguenti:
  • WriteLine
  • WriteLineIf
  • Rientro
  • Riduci rientro
  • L'asserzione
  • Svuotamento
È possibile utilizzare le classi Trace e Debug separatamente o insieme nella stessa applicazione. In un progetto di configurazione di soluzione Debug, traccia e output di Debug sono attivi. Il progetto genera output da entrambe le classi a tutti gli oggetti Listener . Tuttavia, solo il tipo di progetto Release genera output da una classe di traccia . Il progetto di configurazione della soluzione Release ignora le chiamate di metodo di classe Debug .
Trace.WriteLine("Trace Information-Product Starting ");Trace.Indent();

Trace.WriteLine("The product name is "+sProdName);
Trace.WriteLine("The product name is"+sProdName,"Field" );
Trace.WriteLineIf(iUnitQty > 50, "This message WILL appear");
Trace.Assert(dUnitCost > 1, "Message will NOT appear");

Trace.Unindent();
Trace.WriteLine("Trace Information-Product Ending");

Trace.Flush();

Console.ReadLine();

Torna all'inizio

Verificare che funzioni

  1. Assicurarsi che Debug sia la configurazione della soluzione attuale.
  2. Se la finestra Esplora non è visibile, premere la combinazione di tasti CTRL + ALT + L per visualizzarla.
  3. Destro conInfoe quindi fare clic su
    Le proprietà.
  4. Nel riquadro di sinistra della pagina delle proprietà conInfo, sotto il
    Cartella di configurazione , assicurarsi che la freccia punti a
    Il debug.

    Nota: In Visual C# 2005 e Visual C# 2005 Express Edition, fare clic su Debug nella pagina conInfo .
  5. Sopra la cartella di configurazione , nel
    Casella di riepilogo a discesa configurazione Attiva (Debug) o eseguire il Debug, scegliere
    OK. In Visual C# 2005 e Visual C# 2005 Express Edition, fare clic su Attiva (Debug) o nella pagina Debug nella finestra di riepilogo configurazione di Debug e quindi scegliere Salva dal menu File .
  6. Premere CTRL + ALT + O per visualizzare la finestra di Output.
  7. Premere il tasto F5 per eseguire il codice. Quando il
    Verrà visualizzata la finestra di dialogo Asserzione non riuscita , fare clic su
    Ignorare.
  8. Nella finestra della Console, premere INVIO. Il programma dovrebbe terminare e nella finestra di Output dovrebbe essere visualizzato un output simile al seguente
        Debug Information-Product Starting     The product name is Widget
    The available units on hand are100
    The per unit cost is 1.03
    System.Xml.XmlDocument
    Field: The product name is Widget
    Field: The units on hand are100
    Field: The per unit cost is1.03
    Calc: Total Cost is 103
    This message WILL appear
    ---- DEBUG ASSERTION FAILED ----
    ---- Assert Short Message ----
    Message will appear since dUnitcost < 1 is false
    ---- Assert Long Message ----


    at Class1.Main(String[] args) <%Path%>\class1.cs(34)

    The product name is Widget
    The available units on hand are100
    The per unit cost is 1.03
    Debug Information-Product Ending
    Trace Information-Product Starting
    The product name is Widget
    Field: The product name isWidget
    This message WILL appear
    Trace Information-Product Ending


  9. Nella finestra della Console e nel file output.txt deve essere visualizzato il seguente output:
    The product name is Widget    The available units on hand are 100
    The per unit cost is 1.03
    Debug Information-Product Ending
    Trace Information-Product Starting
    The product name is Widget
    Field: The product name is Widget
    This message WILL appear
    Trace Information-Product Ending

Nota: Il file di output.txt si trova nella stessa directory dell'eseguibile conInfo (conInfo.exe). Si tratta in genere della cartella \bin in cui si trova l'origine del progetto. Per impostazione predefinita è C:\Documents and Settings \login utenteDocuments\Visual Studio Projects\conInfo\bin. In Visual C# 2005 e Visual C# 2005 Express Edition, il file di output. txt si trova nella seguente cartella:
C:\Documents and Settings \login utenteDocuments\Visual Studio 2005\Projects\conInfo\conInfo\bin\Debug


Torna all'inizio

Elenco completo del codice

   using System;   using System.Diagnostics;

class Class1
{
[STAThread]
static void Main(string[] args)
{
string sProdName = "Widget";
int iUnitQty = 100;
double dUnitCost = 1.03;
Debug.WriteLine("Debug Information-Product Starting ");
Debug.Indent();
Debug.WriteLine("The product name is "+sProdName);
Debug.WriteLine("The available units on hand are"+iUnitQty.ToString());
Debug.WriteLine("The per unit cost is "+ dUnitCost.ToString());

System.Xml.XmlDocument oxml = new System.Xml.XmlDocument();
Debug.WriteLine(oxml);

Debug.WriteLine("The product name is "+sProdName,"Field");
Debug.WriteLine("The units on hand are"+iUnitQty,"Field");
Debug.WriteLine("The per unit cost is"+dUnitCost.ToString(),"Field");
Debug.WriteLine("Total Cost is "+(iUnitQty * dUnitCost),"Calc");

Debug.WriteLineIf(iUnitQty > 50, "This message WILL appear");
Debug.WriteLineIf(iUnitQty < 50, "This message will NOT appear");

Debug.Assert(dUnitCost > 1, "Message will NOT appear");
Debug.Assert(dUnitCost < 1, "Message will appear since dUnitcost < 1 is false");

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

TextWriterTraceListener tr2 = new TextWriterTraceListener(System.IO.File.CreateText("Output.txt"));
Debug.Listeners.Add(tr2);


Debug.WriteLine("The product name is "+sProdName);
Debug.WriteLine("The available units on hand are"+iUnitQty);
Debug.WriteLine("The per unit cost is "+dUnitCost);
Debug.Unindent();
Debug.WriteLine("Debug Information-Product Ending");
Debug.Flush();

Trace.WriteLine("Trace Information-Product Starting ");
Trace.Indent();

Trace.WriteLine("The product name is "+sProdName);
Trace.WriteLine("The product name is"+sProdName,"Field" );
Trace.WriteLineIf(iUnitQty > 50, "This message WILL appear");
Trace.Assert(dUnitCost > 1, "Message will NOT appear");


Trace.Unindent();
Trace.WriteLine("Trace Information-Product Ending");

Trace.Flush();

Console.ReadLine();
}
}


Torna all'inizio

Risoluzione dei problemi

  • Se il tipo di configurazione della soluzione Release, il Debug sarà ignorato.
  • Dopo aver creato una classe TextWriterTraceListener per una determinata destinazione, TextWriterTraceListener riceve l'output di traccia e le classi Debug . Ciò si verifica indipendentemente dal fatto che si utilizzi il metodo Add della classe Debug o la traccia per aggiungere la classe di listener TextWriterTraceListener .
  • Se si aggiunge un oggetto listener per la stessa destinazione la traccia e le classi Debug , ogni riga di output verrà duplicato, indipendentemente dal fatto che
    Eseguire il debug o analisi genera l'output.
             TextWriterTraceListener myWriter = new TextWriterTraceListener(System.Console.Out);         Debug.Listeners.Add(myWriter);

    TextWriterTraceListener myCreator = new TextWriterTraceListener(System.Console.Out);
    Trace.Listeners.Add(myCreator);


Torna all'inizio

Riferimenti

Per ulteriori informazioni, vedere i seguenti argomenti nella documentazione di.NET Framework Class Library:Torna all'inizio
Proprietà

ID articolo: 815788 - Ultima revisione: 30 gen 2017 - Revisione: 1

Microsoft Visual C# 2008 Express Edition, Microsoft Visual C# 2005 Express Edition, Microsoft Visual C# 2005, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual C# .NET 2002 Standard Edition

Feedback