Cvičení – monitorování proměnných a toku provádění
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.
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.
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; }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 odnpo5. - 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.
V nabídce Soubor editoru Visual Studio Code vyberte Uložit.
V nabídce Spustit vyberte Odebrat všechny zarážky.
Tím se odstraní všechny zarážky z předchozího cvičení.
V zobrazení SPUSTIT A LADIT vyberte Spustit debugování.
Všimněte si, že k chybě dojde při spuštění řádku kódu
Console.Clear();.Na panelu nástrojů Ladění vyberte Zastavit.
Přepněte do zobrazení PRŮZKUMNÍKa a potom otevřete soubor launch.json v Editoru.
Aktualizujte hodnotu atributu
consolenásledujícím způsobem:"console":"integratedTerminal",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.
Přepněte zpět do zobrazení SPUSTIT A LADIT.
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.dllaplikaci.Všimněte si, že se nezobrazují žádné chybové zprávy.
Změna hodnoty atributu
consolez 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.V oblasti Panely pod editorem přepněte z panelu KONZOLY LADĚNÍ na panel TERMINÁL.
Všimněte si, že spuštění kódu se pozastavilo ve zprávě s výzvou, aby uživatel zadal hodnotu .
nVý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':Na příkazovém řádku TERMINAL zadejte 3.
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 exitPředstavte si hlášenou hodnotu
suma 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 jsou3,4a5. 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.
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)}");V zobrazení SPUSTIT A LADIT vyberte Spustit debugování.
Přepněte z panelu KONZOLY LADĚNÍ na panel TERMINÁL.
Na příkazovém řádku TERMINAL zadejte 3.
Provádění kódu se pozastaví na bodu přerušení.
Věnujte chvíli přezkoumání části PROMĚNNÉ v zobrazení SPUSTIT A LADIT.
Všimněte si, že
startIndexbyla přiřazena hodnota, kterou jste zadali, což je3.Vyberte krok do.
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
SumValuesmetody.Oddíl VARIABLES, který uvádí místní proměnné, zobrazuje hodnotu celého čísla
n. Parametrnmetody má přiřazenou jeho hodnotu z argumentustartIndexvolá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á.
Pokračujte ve výběru Step Into, dokud hodnota přiřazená
sumjiž nebude0.Projděte si informace uvedené v části PROMĚNNÉ.
Měli byste vidět následující:
Všimněte si, že hodnota přiřazená ke
sumse změnila z0na4.Pokud chcete pole rozšířit
numbers, vyberte čísla [int[]].
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á hodnotu4. Kód nekompenzuje indexy začínající od nuly.Pokud chcete ukončit ladicí relaci, vyberte Zastavit.
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:
Aktualizujte kód pomocí navrhovaného přístupu a pak soubor Program.cs uložte.
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.
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);Uložte soubor Program.cs.
Nastavte zarážku na posledním řádku kódu.
Nastavte následující výraz WATCH:
num2 / num1 > 5V zobrazení SPUSTIT A LADIT vyberte Spustit debugování.
Všimněte si hodnot zobrazených v částech VARIABLES a WATCH.
Vyberte Pokračovat , dokud se nezobrazí výraz WATCH, který se vyhodnotí jako
true.Pokud se výraz WATCH vyhodnotil jako
truepři první iteraci, vyberte možnost Pokračovat několikrát nebo dokud se nezobrazítruepodruhé.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.
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žeexitnikdy nebudetrue. Nejedná se o programovou podmínku, kterou potřebujete změnit v reálné aplikaci, ale ukazuje to schopnost.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.
Pokud chcete nastavit hodnotu
exitnatruehodnotu , zadejte true a stiskněte Enter.V tomto případě změna hodnoty
exitnatruezpůsobí zavření aplikace přiwhilespuštění příkazu.Vyberte Pokračovat.
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.