Poznáváme C# a Microsoft .NET - 72. díl - Zápis ladících a trasovacích informací

Třídy Debug a Trace jsou třídami, o kterých bude pojednávat dnešní díl. Pomocí těchto tříd jsme totiž schopni využít možností prostředí .NET pro podporu zápisu ladících a trasovacích hlášek.
Poznáváme C# a Microsoft .NET - 72. díl - Zápis ladících a trasovacích informací

Ladící a trasovací informace

Poměrně často, hlavně při vývoji složitějších aplikací, budeme chtít nějakým způsobem sledovat chování naší aplikace a to ať ještě při vývoji a testování nebo již při „ostrém“ provozu aplikace. Toto sledování chování aplikace se často realizuje pomocí zápisu ladících či trasovacích informací. Rozdíl mezi ladícími informacemi a trasovacími informacemi je v zásadě takový, že ladící informace jsou používány hlavně pří testovacím provozu aplikace a informace ladící jsou používány jak při testovacím provozu tak při běžném provozu aplikace. S tím v jakém prostředí jsou jednotlivé typy informací podávány samozřejmě závisí i jejich charakter. Trasovací informace jsou často podávány takřka „na každém kroku“, tedy dokonce například i při každém započetí  metody či jejím ukončení. Tedy podávají informace o průběhu aplikace. Smysl ladících informací je poněkud jiný, což plyne z důvodu, že jsou používány ve vývojovém a testovacím prostředí. Ladící informace obvykle nejčastěji podávají zprávy o výjimečných událostech v oblasti logiky aplikace.

Podpora v prostředí .NET

Podpora pro podávání ladících a trasovacích informací v prostředí .NET  je poměrně elegantně provedena. Umožňuje totiž bez nutnosti zásahů do zdrojového kódu aplikace určit, jestli aplikace běží v prostředí testovacím nebo běžném.

Stěžejními třídami pro uskutečnění zápisu ladících a trasovacích informací jsou třídy Trace a Debug. Jejich rozhraní pro zápis informací je takřka stejné, liší se ovšem v účelu pro jaký mají být tyto třídy použity. Pomocí třídy Trace jsou zapisovány trasovací informace a pomocí třídy Debug informace ladící. To jaké informace budou při spuštění aplikace podávány závisí na způsobu kompilace aplikace. Ladící informace jsou podávány pokud je aplikace zkompilována se symbolem DEBUG a informace trasovací jsou podávány v případě kompilace aplikace se symbolem TRACE. V případě použití vývojového prostředí Visual Studio .NET je při konfiguraci s názvem Debug definován jak symbol DEBUG tak symbol TRACE a při konfiguraci s názvem Release je definován pouze symbol TRACE. Tudíž pokud zkompilujete aplikaci v Visual Studiu .NET v konfiguraci Debug budou podávány jak informace ladící tak informace trasovací, ale v případě použití konfigurace Release budou podávány pouze informace trasovací.

Použití třídy Trace a Debug

Nyní již přejdeme k vlastnímu použití tříd, které nám umožní ladící a trasovací informace podávat. Základní metody pro zápis informací jsou u obou typu velmi podobné a oba typy se nalézají ve jmenném prostoru System.Diagnostics. Pomocí metod definovaných na těchto typech jsme tedy schopni zapisovat různé informace a je možné například definovat, že určitá hláška má být zapsána pouze v případě, že je splněna nějaká podmínka.

Kam budou námi specifikované hlášky zapisovány záleží na takzvaných posluchačích, které se registrují do seznamu těchto tříd. Pro jednotlivé cíle zápisu jsou definovány specifické typy posluchačů, kde každý tento typ je odvozený z typu TraceListener ze jmenného prostoru System.Diagnostics. V základní knihovně tříd .NET frameworku jsou definovány tyto typy tři, což jsou DefaultTraceListener, TextWriterTraceListener a EventLogTraceListener. Instance třídy DefaultTraceListener je implicitně jako jediná obsažena v kolekci Listeners tříd Trace a Debug a informace vypisuje do výstupu ladění a v případě podání informace o selhání pomocí metody Fail tříd Trace a Debug zobrazí informační okno. Třída TextWriterTraceListener umožňuje zapisovat do datových proudů a EventLogTraceListener do logu událostí systému Windows.

Následující zdrojový kód ukazuje použití třídy Debug pro zápis ladících informací. V případě, že bychom chtěli zapsat trasovací informace použili bychom stejným způsobem třídy Trace.

public static void RunWriting()
{
 try
 {
  //vytvoreni instance posluchace asociovaneho s vystupem na konzoli
  TextWriterTraceListener consoleListener = new TextWriterTraceListener(Console.Out);
  //vytvoreni instance posluchace asociovaneho s textovym souborem
  TextWriterTraceListener fileListener = new TextWriterTraceListener("debug.txt");
               //odstraneni vychoziho posluchace
                Debug.Listeners.Clear();
                //pridani posluchacu do seznamu pro debugovani
  Debug.Listeners.Add(consoleListener);
  Debug.Listeners.Add(fileListener);
  Console.Write("Zadejte cislo : ");
  int i = int.Parse(Console.ReadLine());
  //vypsani zpravy pro debug
  Debug.WriteLine("Debugovaci zprava");
  //odsazeni
  Debug.Indent();
  //vypsani zpravy za urcite podminky
  Debug.WriteLineIf(i < 10, "Nactene cislo je mensi nez 10");
  //snizeni odsazeni
  Debug.Unindent();
  Debug.WriteLine("Druha debugovaci zprava");
 }
 finally
 {
  //uzavreni streamu vsech posluchacu
  foreach(TraceListener listener in Debug.Listeners)
  {
                  listener.Flush();
                  listener.Close();
  }
 }
}

V příkladu jsou vytvořeny dva posluchači typu TextWriterListener, kde jeden je asociován z datovým proudem standardního výstupu (Console.Out) a druhý se souborem. Pak je pomocí metody Clear na vlastnosti Listeners vymazán seznam posluchačů, čímž se zařídí odstranění výchozího posluchače typu DefaultTraceListener. Pomocí metody Add se přidají námi vytvořené instance posluchačů do seznamu. Po té jsou pomocí metod WriteLine a WriteLineIf zapsány nějaké hlášky. Také jsou v příkladu použity metody Indent a Unindent k osazování.

V některých situacích může být užitečné využít metody Assert, která zapíše specifickou hlášku v případě, že podmínka, která je metodě předána, není splněna.

Console.Write("Zadejte cislo : ");
int i = int.Parse(Console.ReadLine());
Debug.Assert(i < 10, "Nactene cislo je vetsi nez 10");

Můžeme samozřejmě využít služeb instance posluchače DefaultTraceListener, který je implicitně v kolekci obsažen. Například v následujícím zdrojovém kódu je u této instance použita vlastnost LogFile, která zařídí, že kromě výpisů hlášek na ladící výstup, budou hlášky vypisovány i do specifikovaného souboru. Kromě toho je v příkladu zavolána metoda Fail, sloužící k reportování chyby a instance DefaultTraceListener na toto reaguje zobrazením informačního okna.

DefaultTraceListener defaultListener;
if (Debug.Listeners["Default"] is DefaultTraceListener)
{
     defaultListener = (DefaultTraceListener)Debug.Listeners["Default"];
     defaultListener.LogFileName = @"C:\debug.txt";   
}
Debug.Fail("Zprava o selhani !");

Instance posluchačů je možné přidávat i jinou cestou než na úrovni vlastního zdrojového kódu a to v konfiguračním souboru assembly (jménoAssembly.config), jak můžete vidět níže.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>
    <trace autoflush="true">
      <listeners>
        <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="myListener.log" />
      </listeners>
    </trace>
  </system.diagnostics>
</configuration>

Uvedeným zápisem do konfiguračního souboru byla přidána instance posluchače typu TextWriterTraceListener, který je asociován se soborem myListener.log. Mimo to je atributem autoflush nastavena vlastnost AutoFlush třídy Trace.

Příklady ke článku jsou ke stažení zde.

Témata článku: Software, Microsoft, Programování, Fail, Stěžejní cíl, Výjimečná vlastnost, Díl, Vlastní hláška, Zápis

3 komentáře

Nejnovější komentáře

  • Pavel Polívka 24. 11. 2007 13:59:22
    Programovou oflline verzi seriálu naleznete ke stažení na...
  • Pepo 25. 5. 2006 12:41:05
    Zdravim, je tu niekto kto vie super C#? Mam zadanie a potreboval by som ho...
  • cicobasket, cicobasket 5. 5. 2006 7:48:08
    Rozdíl mezi ladícími informacemi a trasovacími informacemi je v zásadě...
Určitě si přečtěte

Jak se dostat do Windows, když neznáte heslo nebo nejste administrátor

Jak se dostat do Windows, když neznáte heslo nebo nejste administrátor

** S instalačním diskem Windows a znalostí pár příkazů odemknete téměř každý počítač s Windows. ** Poradíme i jak se tomu bránit

24.  7.  2017 | Tomáš Holčík | 35

Nový solární článek dokáže zachytit téměř veškerou energii světelného spektra ze Slunce

Nový solární článek dokáže zachytit téměř veškerou energii světelného spektra ze Slunce

** Vědci vytvořili nový typ solárního článku, který se pyšní neuvěřitelnou efektivitou ** Speciální trojrozměrná struktura dokáže zachytit téměř všechny vlnové délky světla ze Slunce ** Systém solárního článku využívá koncentrátorových čoček pro světlo

22.  7.  2017 | Karel Javůrek | 19

Další důkaz o existenci Planety 9

Další důkaz o existenci Planety 9

21.  7.  2017 | Jiří Černý | 5

10 robotických startupů, které brzy připraví spoustu lidí o práci

10 robotických startupů, které brzy připraví spoustu lidí o práci

** Roboty se v mnoha oblastech používají už dlouho, ale nyní přichází nová éra ** Roboty jsou chytřejší a poradí si s komplexními úkoly ** Náhrada lidí přijde rychleji a ve velkém

20.  7.  2017 | Karel Javůrek | 28


Aktuální číslo časopisu Computer

Test 11 telefonů do 6 000 Kč

Postavte si a přetaktujte počítač

Srovnali jsme 7 sportovních kamer

Která zaměstnání nahradí roboti?