Ripassando, ripassando...... l'esame è sempre più vicinooooooo,cosa ho studiato oggi ? : Debugging Windows varie, Debug e Trace,Log, Trace Switches
La perfezione non è di questa Terra....
(neanche i miei post se trovate degli orrori AVVISATEMI!!!)
Gli errori che possiamo commettere sono essenzialmente: syntax error (visualizzati nella Task List), Run-time e logici. Per porre rimedio alla mancaza di logica nel nostro programma effettuiamo l'analisi line-by-line con l'ausilio di StepInto,StepOver,StepOut,Run To Cursor e Set Next Statement.
Facendo qualche simulazione dell'esame mi sono capitate diverse domande sulle Debugging Windows, facciamo un piccolo richiamo:
- Task List - i syntax error ed i TODO (commenti che indicano le cose che dobbiamo ancora fare)
- Output Windows - dove vengono notificati tutti i messaggi quali load d'assembly, output da Debug e Trace
- Windows per il controllo e l'edit di variabili:
- Local - qui monitoriamo il valore di tutte le variabili della procedura o possiamo editarne il valore
- Auto - per le variabili nella linea corrente e nella linea precedente
- Watch - monitora le variabili che aggiungo ad essa
- QuickWatch - posizionadosi su di una variabile nel codice e facendo click di destro possiamo attivare la QuickWatch per verificare la variabile in questione
- Command Windows -per eseguire la procedura, valutare espressioni, cambiare valore alle variabili durante il debugging
- Running Documents - visualizza la dista dei documenti al momento caricanti nel processo che stiamo eseguendo
- This - visualizza i membri degli oggetti associati con il metodo corrente
- Call Stack - visualizza il nome delle funzioni nella call stack,tipi parametro e valori parametro
- Threads - per esaminari controlli di threades
- Modules - la lista dei moduli (DLL o EXE) usati dal programma
- Memory - stringhe e per visualizzare quei dati che nelle Local,Auto o Watch non vengono visualizzati correttamente
- Disassembly - visualizza il codice dell'assembly corrispondente alle istruzioni create dal compilatore
- Registers - visualizza il contenuto del register
Se vogliamo ottenere un messaggio informativo senza interrompere l'esecuzione del nostro programma utilizziamo le classi Debug (si usa in fase di sviluppo dell'applicazione )e Trace (si usa per testare ed ottimizzare l'applicazione dopo la compilazione e il released) essa è utilizzata anche per l'ottimizzazione dell'applicazione.
Debug e Trace
Le classi Debug e Trace sono definite nel namespace System.Diagnostics, i loro metodi sono per lo più static , tranne la differenza di uso specificata sopra, la Trace è inserita di default quando "buildiamo".Il risultato di questi metodi è visualizzato nella Output windows ed inviato alla Listeners collection, contenente diverse classi per ricevere l'output dalle due classi Debug e Trace. Metodi e proprietà delle due classi sono identici quindi gli esempi che seguono valgono per entrambe basta sostituire alla parola Debug la parola Trace e viceversa.
Alcuni dei metodi per scrivere l'output per i Listeners sono:Write, WriteLine, WriteIf, WriteLineIf, Assert e Fail
Vediamo come si utilizzano WriteLineIf,Assert e Fail:
- Debug.WriteLineIf(se è vero questo,scrivi questo output e ritorna a capo) ossia Debug.WriteLineIf(Z==T,"Z è uguale a T");
- Debug.Assert(se questo è falso,scrivi l'output e visualizza questo messaggio) ossia Debug.Assert(Z==T,"Z è diverso da T");
- Debug.Fail(scrivi l'output incondizionatamente e visualizza questo messaggio) ossia Debug.Fail("Z è diverso da T");
LOG
Vediamo brevemente come ottenere dei log, possiamo ottenere un text file (utilizziamo la classe TextWriteTraceListeners) oppure un EventLog (utilizziamo la classe EventLogTraceListeners). Per creare un file di testo:
Vediamo praticamente come fare:
- Creaimo il nostro progetto File\New\Project e scegliamo come Templates la Windows Application nominandola ErroriTB
- Visualizziamo il codice della nostra Form1 (doppio click)
- Aggiugiamo la direttiva usign System.Diagnostic
- All'interno dell'event handler Form.Load dichiariamo TextWriterTraceListener e aggiungiamola alla Listeners collection
- dichiariamo il BooleanSwitch inserendolo dopo la { della public class Form1 e prima di public Form1()
- Usiamo anche il catch, finally etc (non indicati)
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
//aggiungiamo la direttiva using per gestire il Trace
using System.Diagnostic;
//
namespace ErroriTB
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
//definiamo il BooleanSwitch che serve per controllare che tipo d'output
public BooleanSwitch mioBooleanSwitch = new BooleanSwitch("mioBooleanSwitch", "Questo switch tracing l'applicazione");
//
//(codice omesso)
//
#endregion
private void Form1_Load(object sender, System.EventArgs e)
{
/*Apriamo o creiamo un file di testo
nb. usiamo ....FileMode.OpendOrCreate se il nostro scopo è di creare o di sovrascrive il file di testo miofile.txt
se invece vogliaoo continuare ad aggiungere del testo al file esistente usiamo ....FileMode.Append*/
System.IO.FileStream mioLog = new System.IO.FileStream(@"C:\miofile.txt",System.IO.FileMode.OpenOrCreate);
//dichiariamo il TraceWriteTraceListener
TextWriteTraceListener mioListener = new TextWriteTraceListener(mioLog);
//ora aggiungiamo il mioListener alla Listeners Collection
Trace.Listeners.Add(mioListener);
}
Trace Switches: livelli e configurazione
I livelli del Trace sono definiti in un file XML con estensione .config i livelli informativi del Trace sono:
Nome Valore Messaggio
- TraceLevel.Off 0 nessuno
-
TraceLevel.Error 1 errore
-
TraceLevel.Warning 2 pericolo
-
TraceLevel.Info 3 pericolo + piccola nota informativa
-
TraceLevel.Verbose 4 pericolo + una descrizione dettagliata
NB.
Supponiamo di voler capire quale livello di Trace ha la nostra applicazione possiamo utilizzare le proprietà booleane read-only della classe TraceSwitch quali: TraceSwitch.TraceError,TraceSwitch.TraceWarning, TraceSwitch.TraceInfo e TraceSwitch.TraceVerbose. Grazie ad esse otteniamo un valore di ritorno true in corrispondenza del livello definito, cioè se abbiamo definito TraceLevel.Error il corrispondente TraceSwitch.TraceErrorr è true.
- Creiamo il nostro file .config scegliendo Project\Add New Items e scegliamo tra i Templates il Application Configuration File
- All'interno di questo file XML andiamo a scrivere il codice che attiva il BooleanSwitch
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--Aggiungiamo questo blocco di codice -->
<switches.diagnostics>
<switches>
<!--attiviamo il BooleanSwitch -->
<add name="mioBooleanSwitch" value="1" />
<!-- definiamo il livello del Trace -->
<add name="mioTraceSwitch" value="3"/>
</switches>
</switches.diagnostics>
<!--fine del codice inserito -->
</configuration>
Una volta generato l'eseguibile il file XML deve risiedere nel suo stesso foldere e chimarsi ErroriTB.exe.config le domande su questo argomento sono diverse e sinceramente ho ancora più di qualche dubbio!!!!
Penso che quasi quasi domani ripasso ADO.NET che sinceramente mi piace molto di più degli errori...
A domani!!!