Cvičení – ladění pomocí sady Visual Studio
Je čas dát nově získané znalosti ladění do praxe. Je to váš první den v práci a chcete využít své dovednosti v ladění .NET opravením chyby ve vlajkovém produktu společnosti, Fibonacciho kalkulačce.
Vytvoření ukázkového projektu platformy .NET pro ladění
K nastavení ladění sady Visual Studio pro .NET potřebujeme nejprve projekt .NET. Visual Studio nabízí spoustu úvodních šablon, které usnadňují vytváření nového projektu.
V sadě Visual Studio vyberte Soubor>nový>projekt.
V dialogovém okně Vytvořit nový projekt vyberte Konzolová aplikace a zvolte Další.
Pojmenujte projekt DotNetDebugging a zvolte umístění, kam chcete projekt uložit. U ostatních hodnot ponechte výchozí hodnoty a pak vyberte Další.
Na poslední obrazovce vyberte Vytvořit .
Visual Studio pro nás vytvoří projekt konzoly pomocí šablony, kterou jsme vybrali. Jakmile se projekt načte, otevřete Program.cs jeho výběrem.
Přidání logiky Fibonacciho programu
Náš současný projekt vypisuje do konzoly zprávu „Hello World“, takže nemáme moc co ladit. Místo toho použijeme krátký program .NET k výpočtu Ntého čísla Fibonacciho posloupnosti.
Fibonacciho posloupnost je sada čísel začínající čísly 0 a 1, přičemž každé další číslo vznikne součtem dvou předchozích čísel. Tato posloupnost pokračuje takto:
0, 1, 1, 2, 3, 5, 8, 13, 21...
Následující ukázkový kód obsahuje chybu, takže k diagnostice a řešení problému použijeme nástroje pro ladění sady Visual Studio.
- Obsah souboru Program.cs nahraďte tímto kódem:
int result = Fibonacci(5);
Console.WriteLine(result);
static int Fibonacci(int n)
{
Console.WriteLine("The output is: ");
int n1 = 0;
int n2 = 1;
int sum;
for (int i = 2; i < n; i++)
{
sum = n1 + n2;
n1 = n2;
n2 = sum;
}
return n == 0 ? n1 : n2;
}
Poznámka:
Tento kód obsahuje chybu, kterou budeme ladit později v tomto modulu. Nedoporučujeme, abyste ho používali v jakýchkoli důležitých Fibonacciho aplikacích, dokud tuto chybu neopravíme.
Uložte soubor pomocí Ctrl+S pro Windows a Linux. Pokud používáte Mac, stiskněte klávesyCmd+S.
Než aktualizovaný kód začneme ladit, pojďme se podívat, jak funguje. Spusťte program stisknutím zeleného tlačítka Start na panelu příkazů sady Visual Studio.
Na konci výstupu z ladicí konzole uvidíte, že program zapíše 3 do konzole a poté se ukončí s kódem 0. Ukončovací kód programu 0 obvykle znamená, že program běžel a skončil bez chybového ukončení. Mezi chybovým ukončením a vrácením správné hodnoty je však rozdíl.
V tomto případě jsme program požádali o výpočet páté hodnoty Fibonacciho posloupnosti:
0, 1, 1, 2, 3, 5, 8, 13, 21...
Pátou hodnotou v tomto seznamu je číslo 5, ale náš program vrátil číslo 3. Pojďme k diagnostice a opravě této chyby použít ladicí program.
Použití zarážek a krokování
Přidejte zarážku kliknutím na levý okraj na řádku 1
Znovu spusťte ladění. Program se začne vykonávat. Přeruší (pozastaví provádění) na řádku 1 kvůli nastavené zarážce. Pomocí ovládacích prvků ladicího programu proveďte krokování s vnořením do funkce
Fibonacci().
Kontrola stavu proměnných
Teď pomocí okna Locals nějakou dobu zkontrolujte hodnoty různých proměnných .
- Jaká se zobrazuje hodnota parametru
n? - Jaké jsou na začátku provádění této funkce hodnoty místních proměnných
n1,n2asum?
Poté pokračujeme do
forsmyčky pomocí ovládacího prvku Krok přes ladicího programu.
Pokračujte v postupu, dokud se nedostanete na první řádek uvnitř smyčky
for. Řádek, který říká:sum = n1 + n2;
Poznámka:
Možná si všimnete, že při procházení for(...) {} řádku je potřeba provést několik kroků v příkazech. K tomu dochází, protože na tomto řádku existuje více příkazů. V rámci krokování přejdete na další příkaz ve vašem kódu. Obvykle je na řádku jen jeden příkaz. Pokud tomu ale tak není, potřebujete pro přechod na další řádek více kroků.
Rozbor kódu
Důležitou součástí ladění je to, že se zastavíte a zkusíte odhadnout, co se podle vás snaží části kódu (funkce i bloky, jako jsou smyčky) dělat. Pokud si nejste jistí, je to v pořádku – to je součástí procesu ladění. Aktivní zapojení do procesu ladění vám ale pomůže najít chyby mnohem rychleji.
Než budeme pokračovat dál, připomeneme si, že Fibonacciho posloupnost je řada čísel začínající čísly 0 a 1, přičemž každé další číslo vznikne součtem dvou předchozích čísel.
To znamená, že:
Fibonacci(0) = 0
Fibonacci(1) = 1
Fibonacci(2) = 1 (0 + 1)
Fibonacci(3) = 2 (1 + 1)
Fibonacci(4) = 3 (1 + 2)
Fibonacci(5) = 5 (2 + 3)
Když porozumíme této definici a podíváme se na smyčku for, můžeme odvodit následující:
- Smyčka počítá od čísla 2 do čísla
n(číslo ve Fibonacciho posloupnosti, které hledáme). - Pokud
nje menší než 2, smyčka se nikdy nespustí. Příkazreturnna konci funkce vrátí hodnotu 0, pokudnje 0, a 1, pokudnje 1 nebo 2. Tyto hodnoty jsou nulou, první a druhou hodnotou v fibonacciho řadě podle definice. - Zajímavější případ nastane, když je
nvětší než 2. V těchto případech je aktuální hodnota definována jako součet předchozích dvou hodnot. Takže pro tuto smyčku jsoun1an2předchozí dvě hodnoty asumje hodnota aktuální iterace. Vzhledem k této logice pokaždé, když zjistíme součet předchozích dvou hodnot a nastavíme ho nasum, aktualizujeme hodnotyn1an2hodnoty.
V pořádku, dál nad tím nemusíme přemýšlet. Můžeme se trochu věnovat ladicímu programu. Je ale vhodné rozebrat kód a podívat se, jestli dělá to, co očekáváme, a zjistit více, pokud to nedělá.
Vyhledání chyby pomocí zarážek
Krokování kódu může být užitečné, ale zdlouhavé. Zvlášť když pracujete se smyčkami nebo jiným kódem, který se volá opakovaně. Místo toho, abychom smyčku opakovaně procházeli, můžeme na prvním řádku smyčky nastavit novou zarážku.
Je důležité být strategická ohledně toho, kam umístíme naše zarážky. Zajímá nás zejména hodnota sum, protože představuje aktuální maximální Fibonacciho hodnotu. Pojďme tedy zarážku umístit na čáru posum nastavení.
Přidejte druhou zarážku na řádku 14.
Poznámka:
Pokud si všimnete, že kód spouštíte a pak procházíte další jeden nebo dva řádky, můžete zarážky snadno aktualizovat na vhodnější řádky.
Teď, když máme v této smyčce nastavený dobrý breakpoint, vyberte Pokračovat v ovládacích prvcích ladicího programu, aby se pokračovalo, dokud se nedosáhne breaku. Když se podíváme na místní proměnné, uvidíme následující řádky:
n [int]: 5 n1 [int]: 0 n2 [int]: 1 sum [int]: 1 i [int]: 2Všechny tyto řádky vypadají správně. Při prvním průchodu smyčkou je součet
sumpředchozích dvou hodnot 1. Místo krokování po jednotlivých řádcích můžeme využít naše zarážky a přejít k dalšímu průchodu smyčkou.Výběrem možnosti Continue (Pokračovat) pokračujte v provádění programu, dokud nedojde k další zarážce, která bude u dalšího průchodu smyčkou.
Poznámka:
Nemusíte se moc obávat, že při používání možnosti Continue (Pokračovat) chybu přeskočíte. Měli byste očekávat, že byste mohli kód několikrát ladit, abyste problém našli. Často je rychlejší kód několikrát spustit místo toho, abyste ho opatrně pomalu krokovali.
Tentokrát uvidíme následující hodnoty:
n [int]: 5 n1 [int]: 1 n2 [int]: 1 sum [int]: 2 i [int]: 3Dávají tyto hodnoty stále smysl? Vypadá to tak. U třetího Fibonacciho čísla očekáváme, že se bude součet
sumrovnat číslu 2. To platí.Znovu vyberte Pokračovat a opakujte smyčku.
n [int]: 5 n1 [int]: 1 n2 [int]: 2 sum [int]: 3 i [int]: 4Výsledek je správný. Čtvrtou hodnotou v posloupnosti by mělo být číslo 3.
V tomto okamžiku se sami sebe začnete ptát, jestli kód není celou dobu správný a tuto chybu jste si nevymysleli. Pojďme projít smyčkou ještě jednou naposledy. Ještě jednou vyberte Continue (Pokračovat).
Program byl dokončen a výstup je 3! Výsledek je nesprávný.
Nyní víme, že kód prochází smyčkou správně do chvíle, kdy se hodnota
irovná 4, ale před výpočtem konečné hodnoty se ukončí. Zjistili jsme, kde je chyba.Pojďme nastavit jednu další zarážku na řádku 18, která čte:
return n == 0 ? n1 : n2;Tento bod přerušení nám umožňuje zkontrolovat stav programu před ukončením funkce. Už jsme se naučili vše, co jsme mohli očekávat od předchozích bodů přerušení na řádcích 1 a 13, takže je můžeme vymazat.
Odeberte předchozí zarážky na řádcích 1 a 13. Vyberte zarážky na okraji vedle čísel řádků nebo zrušte zaškrtnutí políček zarážek u řádků 1 a 13 v podokně zarážek v levém dolním rohu.
Teď, když lépe pochopíme, co se děje, a nastavíme zarážku navrženou tak, aby zachytila náš program v aktu chybného chování. Teď už bychom měli být schopni zachytit tuto chybu!
Naposledy spusťte ladicí program.
n [int]: 5 n1 [int]: 2 n2 [int]: 3 sum [int]: 3Konkrétně jsme požádali o Fibonacci(5) a dostali jsme Fibonacci(4), což je nesprávné. Tato funkce vrací
n2, přičemž každá iterace smyčky počítá hodnotusuman2nastaví nasum.Na základě těchto informací a našeho předchozí ladění vidíme, že se smyčka ukončila, když hodnota
ibyla 4, a ne 5.Pojďme se podrobněji podívat na náš
forpříkaz cyklu.for (int i = 2; i < n; i++)Tato logika způsobí, že program se ukončí, jakmile se horní část smyčky for zobrazí rovna
in. To znamená, že kód smyčky se nespustí pro případ, kdyise rovnán. Vypadá to, že kód by spíše měl běžet až do chvíle, kdy platíi <= n:for (int i = 2; i <= n; i++)Když v programu tuto změnu provedeme, měl by vypadat jako tento příklad:
int result = Fibonacci(5); Console.WriteLine(result); static int Fibonacci(int n) { Console.WriteLine("The output is: "); int n1 = 0; int n2 = 1; int sum; for (int i = 2; i <= n; i++) { sum = n1 + n2; n1 = n2; n2 = sum; } return n == 0 ? n1 : n2; }Pokud jste to ještě neudělali, zastavte relaci ladění.
Proveďte předchozí změnu na řádek 11 a ponechte zarážku na řádku 18.
Znovu spusťte ladicí program. Tentokrát, když se dostaneme na zarážku na řádku 18, uvidíme následující hodnoty:
n [int]: 5 n1 [int]: 3 n2 [int]: 5 sum [int]: 5Ano! Zdá se, že jsme na to přišli! Skvělá práce, zachránil jste den pro Fibonacci, Inc.!
Vyberte Continue (Pokračovat), abyste se ujistili, že program vrátí správnou hodnotu.
5 The program '[105260] DotNetDebugging.dll' has exited with code 0 (0x0).A toto správnou hodnotu vrátí.
Zvládli jste to! Ladili jste nějaký kód, který jste nenapsali pomocí ladicího programu .NET v sadě Visual Studio.
V další lekci se dozvíte, jak usnadnit ladění kódu pomocí funkcí protokolování a trasování, které jsou integrované v .NET.