Protokolování a trasování v aplikacích platformy .NET
Když budete pokračovat v vývoji aplikace a bude složitější, možná budete muset pro aplikaci použít další diagnostiku ladění.
Provádění spuštěné aplikace můžete monitorovat trasováním. Instrumentaci trasování a ladění můžete přidat během vývoje aplikace platformy .NET. Tuto instrumentaci můžete použít při vývoji aplikace a po jejím nasazení.
Tato jednoduchá technika je překvapivě účinná. Můžete ji používat v situacích, kdy potřebujete více než jen ladicí program:
- Pomocí tradičního ladicího programu může být obtížné ladit problémy, ke kterým dochází v dlouhých časových obdobích. Protokoly umožňují podrobnou kontrolu po mortemu, která trvá dlouhou dobu. Ladicí programy se naproti tomu omezují na analýzu v reálném čase.
- Aplikace s více vlákny a distribuované aplikace se často obtížně ladí. Připojení ladicího programu někdy mění jejich chování. Podrobné protokoly můžete analyzovat podle potřeby, abyste porozuměli složitým systémům.
- Problémy v distribuovaných aplikacích mohou vznikat ze složitých interakcí mezi mnoha komponentami. Připojení ladicího programu ke každé součásti systému nemusí být vhodné.
- Mnoho služeb by nemělo být zastaveno. Připojení ladicího programu často způsobuje chyby kvůli vypršení časových limitů.
- Problémy nelze vždy předvídat. Protokolování a trasování je navržené tak, aby nezpůsobovalo velké zatížení a programy mohly vždy zaznamenávat informace v případě, že dojde k nějakému problému.
Výpis informací do oken výstupů
Až do této chvíle jsme k zobrazování informací uživateli aplikace používali konzolu. Existují i jiné typy aplikací vytvořených pomocí rozhraní .NET, které mají uživatelská rozhraní a žádná viditelná konzola, jako jsou mobilní, webové a desktopové aplikace. V těchto aplikacích System.Console se používá k protokolování zpráv "na pozadí". Tyto zprávy se můžou zobrazit ve výstupním okně v sadě Visual Studio nebo Visual Studio Code. Výstup může být předáván také do systémového protokolu, jako je logcat v systému Android. V důsledku toho byste měli vzít vážně v úvahu, když používáte System.Console.WriteLine v nekonzolové aplikaci.
Tato situace je místo, kde můžete použít System.Diagnostics.Debug a System.Diagnostics.Trace kromě System.Console. Obě Debug a Trace jsou součástí System.Diagnostics a zapisují do protokolů pouze, když je připojeno příslušné naslouchadlo.
Volba, jaké rozhraní API pro styl tisku použijete, je na vás. Hlavní rozdíly:
-
System.Console
- Je vždy povoleno a vždy vypisuje do konzoly.
- Hodí se pro informace, které může zákazník potřebovat vidět ve vydané verzi.
- Vzhledem k tomu, že se jedná o nejjednodušší přístup,
System.Consolese často používá pro dočasné ladění ad hoc. Tento kód ladění se často vůbec nevrací do správy zdrojového kódu.
-
System.Diagnostics.Trace
- Je povoleno jen v případě, že je definován příkaz
TRACE. - Vypisuje do připojených naslouchacích procesů, což je standardně DefaultTraceListener.
- Použijte toto rozhraní API při vytváření protokolů, které plánujete povolit ve většině sestavení.
- Je povoleno jen v případě, že je definován příkaz
-
System.Diagnostics.Debug
- Je povoleno pouze v případě, že je definován příkaz
DEBUG(v režimu ladění). - Vypisuje do připojeného ladicího programu.
- Toto rozhraní API použijte při vytváření protokolů, které plánujete povolit pouze v ladicích sestaveních.
- Je povoleno pouze v případě, že je definován příkaz
Console.WriteLine("This message is readable by the end user.")
Trace.WriteLine("This is a trace message when tracing the app.");
Debug.WriteLine("This is a debug message just for developers.");
Při navrhování strategie trasování a ladění si promyslete, jak má vypadat výstup. Několik příkazů zápisu vyplněných nesouvisejícími informacemi vytvoří protokol, který je obtížně čitelný. Když použijete příkaz WriteLine ke vkládání souvisejících příkazů na samostatné řádky, může být obtížné odlišit, které informace patří k sobě. Obecně platí, že když chcete kombinováním informací z více zdrojů vytvořit jednu informativní zprávu, použijete více příkazů Write. Když chcete vytvořit jednou celistvou zprávu, použijete příkaz WriteLine.
Debug.Write("Debug - ");
Debug.WriteLine("This is a full line.");
Debug.WriteLine("This is another full line.");
Tento výstup pochází z předchozího protokolování pomocí Debug:
Debug - This is a full line.
This is another full line.
Definování konstant TRACE a DEBUG
Když je aplikace spuštěná během ladění, je standardně definována konstanta DEBUG. Tuto definici můžete řídit přidáním DefineConstants položky do souboru projektu ve skupině vlastností. Zde je příklad zapnutí konstanty TRACE pro konfigurace Debug i Release kromě konstanty DEBUG pro konfigurace Debug.
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DefineConstants>DEBUG;TRACE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<DefineConstants>TRACE</DefineConstants>
</PropertyGroup>
Pokud používáte Trace , když nejste připojeni k ladicímu programu, musíte nakonfigurovat posluchač trasování, jako je dotnet-trace.
Podmíněné trasování
Kromě jednoduchých metod Write a WriteLine máte rovněž možnost přidávat podmínky pomocí WriteIf a WriteLineIf. Například následující logika zkontroluje, jestli je počet nula, a pak zapíše zprávu ladění:
if(count == 0)
{
Debug.WriteLine("The count is 0 and this may cause an exception.");
}
Můžete ho přepsat v jednom řádku kódu:
Debug.WriteLineIf(count == 0, "The count is 0 and this may cause an exception.");
Tyto podmínky můžete použít také s Trace příznaky, které definujete ve své aplikaci:
bool errorFlag = false;
System.Diagnostics.Trace.WriteIf(errorFlag, "Error in AppendData procedure.");
System.Diagnostics.Debug.WriteIf(errorFlag, "Transaction abandoned.");
System.Diagnostics.Trace.Write("Invalid value for data request");
Ověření, že platí určité podmínky
Kontrolní příkaz – neboli příkaz Assert – testuje podmínku, kterou zadáte jako argument příkazu Assert. Pokud je tato podmínka vyhodnocena jako true, nedojde k žádné akci. Pokud je tato podmínka vyhodnocena jako false, kontrola selže. Pokud máte spuštěný build pro ladění, přejde program do režimu pozastavení.
Metodu Assert můžete použít buď z příkazu Debug, nebo z příkazu Trace, které jsou v oboru názvů System.Diagnostics. Metody třídy Debug nejsou zahrnuty ve vydané verzi vašeho programu, takže nezvyšují velikost ani nesnižují rychlost kódu vydané verze.
Metodu System.Diagnostics.Debug.Assert použijte volně k testování podmínek, které by měly být splněny, pokud je váš kód správný. Předpokládejme například, že jste napsali funkci, která rozděluje celá čísla. Podle matematických pravidel nemůže být dělitel nikdy nula. Tuto podmínku můžete otestovat pomocí kontrolního příkazu:
int IntegerDivide(int dividend, int divisor)
{
Debug.Assert(divisor != 0, $"{nameof(divisor)} is 0 and will cause an exception.");
return dividend / divisor;
}
Když spustíte tento kód v ladicím programu, je kontrolní příkaz vyhodnocen. Ve verzi vydání se ale porovnání neprovádí, takže nedochází k žádnému dodatečnému zatížení.
Poznámka:
Pokud použijete System.Diagnostics.Debug.Assert, ujistěte se, že jakýkoli kód uvnitř Assert nemění výsledky programu, pokud je Assert odebrán. Jinak byste mohli náhodně zavést chybu, která se projeví pouze ve vydané verzi vašeho programu. Buďte obzvláště opatrní u kontrolních příkazů, které obsahují volání funkcí nebo procedur.
Jak vidíte, použití Debug a Trace z System.Diagnostics oboru názvů představuje skvělý způsob, jak poskytnout důležitý kontext při spuštění a ladění aplikace.