Cvičení – monitorování proměnných a toku provádění

Dokončeno

Zobrazení SPUSTIT A LADIT poskytuje vývojářům snadný způsob, jak monitorovat proměnné a výrazy, sledovat tok provádění a spravovat zarážky během procesu ladění.

Prozkoumejte sekce zobrazení Spustit a Ladit

Každá část zobrazení SPUSTIT A LADIT poskytuje jedinečné možnosti. Použití kombinace těchto částí během procesu ladění je často užitečné.

Oddíl PROMĚNNÉ

Monitorování stavu proměnných je důležitým aspektem ladění kódu. Neočekávané změny ve stavu proměnné často pomáhají identifikovat chyby logiky v kódu.

Oddíl VARIABLES uspořádá proměnné podle oboru. Obor Locals zobrazuje proměnné v aktuálním oboru (aktuální metoda).

Poznámka:

Oddíl příkazů nejvyšší úrovně konzolové aplikace se považuje za vlastní metodu. Metoda s názvem Main.

Zobrazené rozsahy můžete rozbalit tak, že vyberete šipku vlevo od názvu rozsahu. Můžete také rozbalit proměnné a objekty. Následující snímek obrazovky zobrazuje numbers pole pod Locals oborem.

Snímek obrazovky znázorňující rozbalenou proměnnou v části Proměnné v zobrazení Spustit a ladit

Pomocí oddílu VARIABLES je také možné změnit hodnotu proměnné za běhu. Poklikejte na název proměnné a zadejte novou hodnotu.

Část KUKÁTEK

Co když chcete sledovat stav proměnné v čase nebo v různých metodách? Při každém hledání proměnné to může být zdlouhavé. To je místo, kde je oddíl WATCH užitečný.

Můžete vybrat tlačítko Přidat výraz (zobrazí se jako znaménko plus: +) a zadat název proměnné nebo výraz, který chcete sledovat. Alternativně můžete kliknout pravým tlačítkem myši na proměnnou v oddílu VARIABLES a vybrat Add to watch.

Při spuštění kódu se automaticky aktualizují všechny výrazy uvnitř oddílu WATCH.

Sekce ZÁSOBNÍK VOLÁNÍ

Pokaždé, když váš kód vstoupí do nějaké metody z jiné metody, přidá se do zásobníku volání aplikace další vrstva. Když se vaše aplikace stane složitou a máte dlouhý seznam metod volaných jinými metodami, zásobník volání představuje stopu volání metody.

Sekce Zásobník volání je užitečná, když se pokoušíte najít původní místo pro výjimku nebo výraz WATCH. Pokud vaše aplikace vyvolá neočekávanou výjimku, často se v konzole zobrazí zpráva podobná následující:

Exception has occurred: CLR/System.DivideByZeroException
An unhandled exception of type 'System.DivideByZeroException' occurred in Debug1.dll: 'Attempted to divide by zero.'
    at Program.<<Main>$>g__WriteMessage|0_1() in C:\Users\howdc\Desktop\Debug1\Program.cs:line 27
    at Program.<<Main>$>g__Process1|0_0() in C:\Users\howdc\Desktop\Debug1\Program.cs:line 16
    at Program.<Main>$(String[] args) in C:\Users\howdc\Desktop\Debug1\Program.cs:line 10

Odsazená skupina at Program ... řádků pod chybovou zprávou se nazývá trasování zásobníku. Trasování zásobníku uvádí název a původ každé metody, která byla volána v rámci operací vedoucích k výjimce. I když může být obtížné informace dešifrovat, protože můžou obsahovat také informace z modulu runtime .NET. V tomto příkladu je výpis zásobníku poměrně čistý a můžete vidět, že výjimka nastala v metodě s názvem WriteMessage. Zásobník pochází z metody s názvem Main, což je oddíl příkazů nejvyšší úrovně konzolové aplikace.

Sekce CALL STACK vám pomůže vyhnout se potížím s dešifrováním trasování zásobníku, které je přeplněné informacemi o .NET runtime. Filtruje nežádoucí informace, aby ve výchozím nastavení zobrazoval pouze relevantní metody z vašeho vlastního kódu. Zásobník volání můžete ručně uvolnit, abyste zjistili, odkud výjimka pochází.

Oddíl Bod Přerušení

Oddíl ZARÁŽKY zobrazuje aktuální nastavení zarážky a dá se použít k povolení nebo zakázání konkrétních zarážek během ladicí relace.

Konfigurace aplikace a spuštění konfigurace

Když pracujete na konzolové aplikaci, která čte uživatelský vstup, budete pravděpodobně muset aktualizovat spouštěcí konfigurační soubor.

  1. Následujícím způsobem aktualizujte kód v souboru Program.cs:

    string? readResult;
    int startIndex = 0;
    bool goodEntry = false;
    
    int[] numbers = { 1, 2, 3, 4, 5 };
    
    // Display the array to the console.
    Console.Clear();
    Console.Write("\n\rThe 'numbers' array contains: { ");
    foreach (int number in numbers)
    {
        Console.Write($"{number} ");
    }
    
    // To calculate a sum of array elements, 
    //  prompt the user for the starting element number.
    Console.WriteLine($"}}\n\r\n\rTo sum values 'n' through 5, enter a value for 'n':");
    while (goodEntry == false)
    {
        readResult = Console.ReadLine();
        goodEntry = int.TryParse(readResult, out startIndex);
    
        if (startIndex > 5)
        {
            goodEntry = false;
            Console.WriteLine("\n\rEnter an integer value between 1 and 5");
        }
    }
    
    // Display the sum and then pause.
    Console.WriteLine($"\n\rThe sum of numbers {startIndex} through {numbers.Length} is: {SumValues(numbers, startIndex)}");
    
    Console.WriteLine("press Enter to exit");
    readResult = Console.ReadLine();
    
    // This method returns the sum of elements n through 5
    static int SumValues(int[] numbers, int n)
    {
        int sum = 0;
        for (int i = n; i < numbers.Length; i++)
        {
            sum += numbers[i];
        }
        return sum;
    }
    
  2. Projděte si kód za minutu.

    Všimněte si následujícího:

    • Kód určuje celočíselnou matici obsahující pět čísel.
    • Kód zobrazí výstup v konzole.
    • Kód vyzve uživatele k zadání počátečního čísla prvku n, které používá k sumarizaci prvků pole od n po 5.
    • Kód vypočítá součet v metodě, zobrazí výsledky v konzole a pak se pozastaví.

    Poznámka:

    Panel KONZOLY LADĚNÍ nepodporuje vstup uživatele z konzoly.

  3. V nabídce Soubor editoru Visual Studio Code vyberte Uložit.

  4. V nabídce Spustit vyberte Odebrat všechny zarážky.

    Tím se odstraní všechny zarážky z předchozího cvičení.

  5. V zobrazení SPUSTIT A LADIT vyberte Spustit debugování.

  6. Všimněte si, že k chybě dojde při spuštění řádku kódu Console.Clear();.

  7. Na panelu nástrojů Ladění vyberte Zastavit.

  8. Přepněte do zobrazení PRŮZKUMNÍKa a potom otevřete soubor launch.json v Editoru.

  9. Aktualizujte hodnotu atributu console následujícím způsobem:

    "console":"integratedTerminal",
    
  10. V nabídce Soubor editoru Visual Studio Code vyberte Uložit a zavřete launch.json soubor.

Kontrola výstupu aplikace a identifikace problémů

Při kontrole výstupu aplikace můžete odhalit problémy s logikou, které jste při psaní kódu přehlédli.

  1. Přepněte zpět do zobrazení SPUSTIT A LADIT.

  2. V zobrazení SPUSTIT A LADIT vyberte Spustit debugování.

    Zprávy zobrazené na panelu KONZOLY LADĚNÍ zobrazují ladicí program, který se připojuje k Debug101.dll aplikaci.

  3. Všimněte si, že se nezobrazují žádné chybové zprávy.

    Změna hodnoty atributu console z internalConsole na integratedTerminal v konfiguračním souboru spuštění opravila chybu konzoly. Teď ale potřebujete najít konzolu, která obsahuje váš výstup.

  4. V oblasti Panely pod editorem přepněte z panelu KONZOLY LADĚNÍ na panel TERMINÁL.

  5. Všimněte si, že spuštění kódu se pozastavilo ve zprávě s výzvou, aby uživatel zadal hodnotu .n

    Výstup na panelu TERMINÁL by měl vypadat takto:

    
    The 'numbers' array contains: { 1 2 3 4 5 }
    
    To sum values 'n' through 5, enter a value for 'n':
    
  6. Na příkazovém řádku TERMINAL zadejte 3.

  7. Zkontrolujte výstup z aplikace.

    Výstup na panelu TERMINÁL by měl vypadat takto:

    
    The 'numbers' array contains: { 1 2 3 4 5 }
    
    To sum values 'n' through 5, enter a value for 'n':
    3
    
    The sum of numbers 3 through 5 is: 9
    press Enter to exit
    
  8. Představte si hlášenou hodnotu sum a hodnoty prvků pole 3 až 5 zobrazené v horní části konzoly.

    Zpráva říká: The sum of numbers 3 through 5 is: 9. Maticové prvky 3 až 5 však jsou 3, 4a 5. Neměl by být hlášený součet 12?

    V zobrazení SPUSTIT A LADIT můžete použít oddíl PROMĚNNÉ k prozkoumání problému.

Monitorování stavu proměnné

V některých případech stačí jednoduše monitorovat stav proměnné k identifikaci problému logiky ve vaší aplikaci.

  1. Nastavte zarážku na následujícím řádku kódu:

    Console.WriteLine($"\n\rThe sum of numbers {startIndex} through {numbers.Length} is: {SumValues(numbers, startIndex)}");
    
  2. V zobrazení SPUSTIT A LADIT vyberte Spustit debugování.

  3. Přepněte z panelu KONZOLY LADĚNÍ na panel TERMINÁL.

  4. Na příkazovém řádku TERMINAL zadejte 3.

    Provádění kódu se pozastaví na bodu přerušení.

  5. Věnujte chvíli přezkoumání části PROMĚNNÉ v zobrazení SPUSTIT A LADIT.

    Všimněte si, že startIndex byla přiřazena hodnota, kterou jste zadali, což je 3.

  6. Vyberte krok do.

  7. Všimněte si, že se aktualizují oddíly VARIABLES a CALL STACK.

    Oddíl CALL STACK ukazuje, že provádění kódu se přesunulo do SumValues metody.

    Oddíl VARIABLES, který uvádí místní proměnné, zobrazuje hodnotu celého čísla n. Parametr n metody má přiřazenou jeho hodnotu z argumentu startIndexvolání metody . V tomto případě změna názvů proměnných dává jasně najevo, že hodnota byla předána, nikoli odkazový ukazatel.

    Poznámka:

    V tomto případě uvidíte většinu kódu v Editoru, takže možná nepotřebujete oddíl CALL STACK, ale když pracujete na větších aplikacích s hluboko vnořenými a vzájemně propojenými voláními metod, může být cesta provádění zobrazená v části CALL STACK velmi užitečná.

  8. Pokračujte ve výběru Step Into, dokud hodnota přiřazená sum již nebude 0.

  9. Projděte si informace uvedené v části PROMĚNNÉ.

    Měli byste vidět následující:

    Snímek obrazovky znázorňující část Proměnné v zobrazení Spustit a Ladit

    Všimněte si, že hodnota přiřazená ke sum se změnila z 0 na 4.

  10. Pokud chcete pole rozšířit numbers, vyberte čísla [int[]].

    Snímek obrazovky znázorňující rozbalené prvky pole v části Proměnné v zobrazení Spustit a ladit

  11. Vzpomeňte si, že k prvkům pole se přistupuje pomocí čísel indexů založených na nule.

    V tomto případě je chyba logiky nesrovnalostí mezi pokyny v uživatelském rozhraní a základním kódem. Uživatelské rozhraní odkazuje na prvky pole 1–5. Kód však používá hodnotu zadaná uživatelem pro přístup k prvkům pole založenému na nule. Prvek pole, který má index 3, ukládá hodnotu 4. Kód nekompenzuje indexy začínající od nuly.

  12. Pokud chcete ukončit ladicí relaci, vyberte Zastavit.

  13. Chvíli zvažte, jak můžete problém vyřešit.

    Tento problém může být opraven v uživatelském rozhraní výzvou, aby uživatel zadal hodnotu v rozmezí od 0 do 4. Dá se také opravit v kódu odečtením hodnoty 1 od zadané hodnoty. Obecně řečeno, váš cíl by mělo být jasné a snadno použitelné uživatelské rozhraní. V tomto případě může být lepší aktualizovat kód následujícím způsobem:

    Console.WriteLine($"\n\rThe sum of numbers {startIndex} through {numbers.Length} is: {SumValues(numbers, startIndex - 1)}");
    

    Spuštění aktualizovaného kódu vytvoří následující výstup:

    Snímek obrazovky znázorňující výstup po aktualizaci logiky aplikace

  14. Aktualizujte kód pomocí navrhovaného přístupu a pak soubor Program.cs uložte.

  15. Vymažte zarážku, znovu spusťte aplikaci v ladicím programu a ověřte, že se v TERMINÁLU zobrazí zamýšlený výsledek.

    Právě jste použili stav proměnné k identifikaci a opravě problému logiky. Skvělá práce.

Sledování výrazů

Část WATCH se dá použít k monitorování výrazů založených na jedné nebo více proměnných.

Předpokládejme, že pracujete na aplikaci, která provádí číselné výpočty v datové sadě. Domníváte se, že váš kód produkuje nespolehlivé výsledky, pokud je poměr mezi dvěma číselnými proměnnými větší než 5. Pomocí oddílu WATCH můžete monitorovat počítaný poměr.

  1. Aktualizujte soubor Program.cs následujícím kódem:

    bool exit = false;
    var rand = new Random();
    int num1 = 5;
    int num2 = 5;
    
    do
    {
        num1 = rand.Next(1, 11);
        num2 = num1 + rand.Next(1, 51);
    
    } while (exit == false);
    
  2. Uložte soubor Program.cs.

  3. Nastavte zarážku na posledním řádku kódu.

  4. Nastavte následující výraz WATCH:

    num2 / num1 > 5
    
  5. V zobrazení SPUSTIT A LADIT vyberte Spustit debugování.

  6. Všimněte si hodnot zobrazených v částech VARIABLES a WATCH.

  7. Vyberte Pokračovat , dokud se nezobrazí výraz WATCH, který se vyhodnotí jako true.

    Pokud se výraz WATCH vyhodnotil jako true při první iteraci, vyberte možnost Pokračovat několikrát nebo dokud se nezobrazí true podruhé.

  8. Zvažte, jak se oddíl WATCH používá.

    V tomto scénáři jste zjistili, že váš kód produkuje nespolehlivé výsledky, pokud je poměr mezi dvěma číselnými proměnnými větší než 5. V části WATCH jste vytvořili výraz, který představuje tuto podmínku. Teď můžete tuto podmínku sledovat pomocí sekce 'Sledování'.

Úprava hodnoty přiřazené proměnné v oddílu VARIABLES

Může se stát, že budete chtít programovou podmínku vytvořit ručně. Část PROMĚNNÉ v zobrazení SPUSTIT A LADIT vám umožňuje provést to změnou stavu proměnné během běhu.

  1. Věnujte chvíli prohlédnutí kódu, který používáte.

    Všimněte si, že kód nikdy neodejde ze smyčky do , protože exit nikdy nebude true. Nejedná se o programovou podmínku, kterou potřebujete změnit v reálné aplikaci, ale ukazuje to schopnost.

  2. V části PROMĚNNÉ KLEPNĚTE pravým tlačítkem myši exit [bool]a pak vyberte Nastavit hodnotu.

    Oddíl VARIABLES umožňuje změnit hodnotu přiřazenou proměnné za běhu. To může být užitečné, když chcete zjistit, jak váš kód reaguje na konkrétní podmínku.

  3. Pokud chcete nastavit hodnotu exit na truehodnotu , zadejte true a stiskněte Enter.

    V tomto případě změna hodnoty exit na true způsobí zavření aplikace při while spuštění příkazu.

  4. Vyberte Pokračovat.

  5. Všimněte si, že na panelu KONZOLY LADĚNÍ se zobrazí zpráva informující o ukončení programu.

Gratulujeme! Úspěšně jste použili sekce VARIABLES a WATCH v zobrazení SPUSTIT A LADIT.

Rekapitulace

Tady je několik důležitých věcí, které je potřeba si z této lekce zapamatovat:

  • Monitorujte stav proměnné pomocí části PROMĚNNÉ v zobrazení SPUSTIT A LADIT.
  • Pomocí části WATCH v zobrazení SPUSTIT A LADIT sledujte výraz v průběhu času nebo pomocí různých metod.
  • Pomocí části Zásobník volání v zobrazení Spustit a ladění vyhledejte zdrojové umístění výjimky nebo sledovaného výrazu.
  • Pomocí oddílu VARIABLES můžete změnit přiřazenou hodnotu proměnné za běhu.