Cvičení – ladění pomocí sady Visual Studio

Dokončeno

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.

  1. V sadě Visual Studio vyberte Soubor>nový>projekt.

  2. V dialogovém okně Vytvořit nový projekt vyberte Konzolová aplikace a zvolte Další.

  3. 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ší.

  4. 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.

  1. 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.

  1. Uložte soubor pomocí Ctrl+S pro Windows a Linux. Pokud používáte Mac, stiskněte klávesyCmd+S.

  2. 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.

  3. 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.

Okno terminálu s upraveným výstupem programu

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í

  1. Přidejte zarážku kliknutím na levý okraj na řádku 1

  2. 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().

    Snímek obrazovky s tlačítkem pro krok dovnitř

Kontrola stavu proměnných

Teď pomocí okna Locals nějakou dobu zkontrolujte hodnoty různých proměnných .

Snímek obrazovky s panelem Místní hodnoty

  • 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, n2 a sum?
  1. Poté pokračujeme do for smyčky pomocí ovládacího prvku Krok přes ladicího programu.

    Snímek obrazovky s tlačítkem pro krok přes

  2. 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í:

  1. Smyčka počítá od čísla 2 do čísla n (číslo ve Fibonacciho posloupnosti, které hledáme).
  2. Pokud n je menší než 2, smyčka se nikdy nespustí. Příkaz return na konci funkce vrátí hodnotu 0, pokud n je 0, a 1, pokud n je 1 nebo 2. Tyto hodnoty jsou nulou, první a druhou hodnotou v fibonacciho řadě podle definice.
  3. Zajímavější případ nastane, když je n vě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 jsou n1 a n2 předchozí dvě hodnoty a sum je 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 na sum, aktualizujeme hodnoty n1 a n2 hodnoty.

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í.

  1. Přidejte druhou zarážku na řádku 14.

    Snímek obrazovky s nastavením druhé zarážky

    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.

  2. 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]: 2
    

    Všechny tyto řádky vypadají správně. Při prvním průchodu smyčkou je součet sum př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.

  3. 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]: 3
    

    Dávají tyto hodnoty stále smysl? Vypadá to tak. U třetího Fibonacciho čísla očekáváme, že se bude součet sum rovnat číslu 2. To platí.

  4. Znovu vyberte Pokračovat a opakujte smyčku.

    n [int]: 5
    n1 [int]: 1
    n2 [int]: 2
    sum [int]: 3
    i [int]: 4
    

    Výsledek je správný. Čtvrtou hodnotou v posloupnosti by mělo být číslo 3.

  5. 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 i rovná 4, ale před výpočtem konečné hodnoty se ukončí. Zjistili jsme, kde je chyba.

  6. 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.

  7. 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.

    Snímek obrazovky se zarážkami uvedenými v podokně zarážek

    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!

  8. Naposledy spusťte ladicí program.

    n [int]: 5
    n1 [int]: 2
    n2 [int]: 3
    sum [int]: 3
    

    Konkré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á hodnotu sum a n2 nastaví na sum.

    Na základě těchto informací a našeho předchozí ladění vidíme, že se smyčka ukončila, když hodnota i byla 4, a ne 5.

    Pojďme se podrobněji podívat na náš for pří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, kdy i se 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;
    }
    
  9. Pokud jste to ještě neudělali, zastavte relaci ladění.

  10. Proveďte předchozí změnu na řádek 11 a ponechte zarážku na řádku 18.

  11. 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]: 5
    

    Ano! Zdá se, že jsme na to přišli! Skvělá práce, zachránil jste den pro Fibonacci, Inc.!

  12. 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.