7. DEBUG — GDB a Valgrind

Debugging #

Osnova cvičení #

  • Nastavení a ovládání VS Code debuggeru
  • Demonstrace debugování jednoduché úlohy
  • Řešení sady úloh ve dvojicích (systematický přístup)
  • Debugování komplexního vícesouborového programu

Pro toto cvičení si stáhněte 07-debug.zip

Příprava vlastního počítače #

Pokud nemáte svůj počítač předem připravený, doporučujeme pro toto cvičení použít školní počítač.

Požadovaný software #

  1. Editor: Nainstalujte VS Code
  2. Rozšíření: Nainstalujte rozšíření C/C++ Extension: CTRL+Pext install ms-vscode.cpptools
  3. Debugger:
    • Na macOS by již měl být nainstalovaný debugger LLDB (ověřte přes lldb --version).
    • Na Linuxu/WSL máte pravděpodobně již nainstalované GDB (ověřte pomocí gdb --version). Pokud ne, nainstalujte pomocí:
      • Ubuntu/Debian: sudo apt install gdb
      • Arch: sudo pacman -Syu gdb

Konfigurace projektu pro debugging #

VS Code potřebuje konfigurační soubor .vscode/launch.json k nastavení debuggeru. Pro toto cvičení si tento soubor nechte vygenerovat spuštěním scriptu setup.py ve rozbaleném adresáři. Pro více informací viz dokumentace konfigurace debugování ve VS Code.

Základní koncepty použití debuggeru (opakování z přednášky) #

Ovládání běhu programu #

Akce Popis Klávesová zkratka
Run/Continue Pokračuje v běhu až do dalšího breakpointu F5
Step Over Provede aktuální řádek (nepřeskakuje do funkcí) F10
Step Into Vstoupí do volané funkce F11
Step Out Dokončí aktuální funkci a vrátí se Shift+F11
Breakpoint Bod zastavení v kódu F9

Inspekce stavu programu #

  • Variables panel: Zobrazuje lokální proměnné a jejich hodnoty
  • Watch panel: Sledování vlastních výrazů
    • Přístup k prvkům pole: array[5]
    • Přetypování: (int[100]*)pointer pro zobrazení pole ve velikosti 100
  • Call Stack: Historie volání funkcí vedoucí k aktuální pozici

Systematický debugging workflow #

Tři kroky k nalezení chyby:

  1. Reprodukce → Spolehlivě zopakovat chybu
  2. Izolace → Minimalizovat vstup vyvolávající chybu (v tomto cvičení nebude potřebné)
  3. Lokalizace → Najít přesné místo v kódu

Základní nástroje:

  • Compiler Warnings
  • Valgrind & AddressSanitizer
  • Debugger (GDB/LLDB + VS Code)

Část 1: Úvod a demo (10 min) #

Společně se cvičícím si prakticky vyzkoušíme postup debugování a ovládání debuggeru na demonstračním úkolu. Opakujete všechny kroky po cvičícím. V další části budete používat stejné nástoje samostatně a ve třetí části cvičení je budete muset sami nastavit.

Praktická ukázka: Otevřete adresář 0-demo a následujte demonstraci cvičícího.

Část 2: Práce ve dvojicích (25 min řešení + 10 min diskuze) #

Zadání #

Pracujte ve dvojicích na úlohách v adresářích 16. Vašim cílem je:

  • Co nejrychleji nalézt a popsat chybu (ne nutně opravit!).
  • Použít procvičované nástroje, ne čtení kódu.
  • Systematicky dokumentovat postup v REPORT.md.

Čas na úlohy je omezený. Pokud vám něco není jasné, nebo se zaseknete, ihned se ptejte vedlejší dvojice nebo cvičícího!

Struktura úloh #

Každý adresář s úlohou obsahuje:

  • main.c - zdrojový kód s nápovědou v komentáři na začátku
  • Makefile - připravené cíle pro různé nástroje
  • REPORT.md - šablona pro váš report

Časový limit: 3-5 minut na úlohu. Pokud se zaseknete, požádejte o radu!

Výstup: 6 vyplněných reportů s nalezenými problémy. Po dokončení porovnejte přístupy se sousední dvojicí.

Dostupné nástroje (Makefile cíle pro každou úlohu) #

Příkaz Účel Kdy použít
make Kompilace s varováními Vždy jako první krok
make run Kompilace a spuštění Test základní funkčnosti
make asan AddressSanitizer Paměťové chyby, buffer overflow
make valgrind Valgrind Memory leaky, neinicializované čtení
make clean Vyčištění Reset před novou kompilací

Část 3: Debugování komplexního systému (30 min práce + 5 min diskuze) #

Tuto úlohu můžete řesit samostatně nebo ve dvojicích. Ve dvojici doporučujeme, aby oba ve dvojici měli projekt otevřený a společně pouze diskutovali poznatky.

Přehled #

Budete pracovat s reálně vypadajícím vícesouborovým programem (~700 řádků, 8 souborů) pro správu studentů a známek. Program obsahuje 6 různých typů chyb. Budete chyby hledet na základě popisu projevů od uživatelů.

Klíčové: NEČTĚTE celý kód! Použijte systematický přístup s nástroji.

Co systém umí #

  • Správa databáze studentů
  • Přidávání a správa známek
  • Výpočet statistik (průměr, směrodatná odchylka)
  • Ukládání/načítání dat ze souborů
  • Interaktivní menu pro všechny operace

Povinná příprava (3 minuty) #

Neopomíjejte tento krok - ušetří vám čas později!

  1. Přejděte do adresáře: cd 7-complex
  2. Přečtěte dokumentaci: Prostudujte README.md a BUGS.md (popisy hlášených chyb od uživatelů).
  3. Zkompilujte program: Spusťte make a prohlédněte si výstup kompilátoru.
  4. Prohlédněte si testovací data: Otevřete students.txt a všimněte si struktury dat.
  5. Formulujte hypotézu: “Na základě bug reportů očekávám chyby typu…”

Přístup k řešení #

Program má 6 hlášených chyb zdokumentovaných v BUGS.md. Každá chyba obsahuje:

  • Popis problému z pohledu uživatele
  • Kroky k reprodukci
  • Očekávané vs. skutečné chování

Doporučený postup:

  1. Přečtěte si bug report v BUGS.md
  2. Zkuste chybu reprodukovat podle kroků
  3. Zvolte nástroj k lokalizaci
  4. Zdokumentujte své zjištění

Typy chyb v programu:

  • Business logic errors (chybná validace, špatné vzorce)
  • Memory errors (buffer overflow, neinicializované proměnné)
  • Memory leaks (neuvolněná paměť)

Závěr cvičení (5 min) #

Každý student sdílí JEDNU radu/poznatek k debugování.

  • Příště při debugování jako první krok…
  • Největší časová úspora při debugování je…
  • Chyba, kterou už nikdy neudělám:…
  • Nástroj, který mě dnes překvapil:…