GDB: Krok za krokem ladění C++ programů bez strachu z segfault
GDB umožňuje přesně lokalizovat místo pádu programu za 15–30 sekund. Místo přidávání print'ů do každé funkce a opakovaného zkompilování použijte ladící nástroj pro sledování zásobníku volání a hodnot proměnných v reálném čase. Pro práci s informacemi o ladění zkompilujte s přepínači -g -O0:
g++ -g -O0 -o myprogram myprogram.cpp
Zkontrolujte přítomnost ladících dat příkazem file myprogram. Spusťte: gdb ./myprogram, poté run. Při segfaultu se GDB zastaví a ukáže přesné místo pomocí backtrace (bt).
Příklad pádu ve std::string::operator= s nulovým ukazatelem this je okamžitě viditelný ve zásobníku:
#0 0x... in std::string::operator= (this=0x0, ...)
#1 0x... in UserData::setName (...)
#2 0x... in main ()
Aktivujte čitelný výstup: set print pretty on a set print demangle on.
Bodové zarážky a postupné provádění
Nastavte zarážky pro kontrolu běhu programu:
break main— na začátku mainbreak program.cpp:42— na konkrétní řádcebreak UserData::setName— při vstupu do metodyinfo break— seznam zarážek
U C++ s přetížením uveďte signaturu: break print(int) nebo break print(std::string). Pokročilý případ: rbreak ^.*::print$ pro všechny metody print podle regex.
Navigace v kódu:
| Příkaz | Zkratka | Akce |
|---------|------------|----------|
| next | n | řádek bez vstupu do funkce |
| step | s | řádek s vstupem do funkce |
| finish | fin | až do konce funkce |
| continue | c | až k další zarážce |
V C++ vyhýbejte se step u STL-volání jako push_back — použijte next, abyste se nepropadli do implementace knihovny.
Zobrazení proměnných a objektů
Příkazy pro inspekci:
print variable_name— hodnota proměnnéprint *pointer— přes ukazatelprint vec.size()— volání metodydisplay variable_name— automatické zobrazení po krocíchinfo locals— lokální proměnnéinfo args— argumenty funkce
GDB správně zobrazuje C++ typy:
print myVector
$1 = std::vector of length 5, capacity 8 = {1, 2, 3, 4, 5}
print myString
$2 = "Hello, World!"
Pokud vidíte <optimized out> — zkompilujte znovu s -O0. Bez -g nejsou jména proměnných viditelná.
TUI režim pro vizuální ladění
Aktivujte tui enable — obrazovka se rozdělí: nahoře kód s označením aktuální řádky, dole příkazy. Ovládání:
layout src— zdrojový kódlayout asm— assemblerlayout split— kód + assemblerlayout regs— registryCtrl + X, 2— dvě oknaCtrl + X, o— přepnutí mezi oknyCtrl + X, a— opuštění TUI
TUI usnadňuje navigaci a zobrazuje kontext bez čísel řádků.
Běžné problémy a jejich řešení
| Problém | Řešení |
|----------|---------|
| <optimized out> | -O0 při kompilaci |
| Žádná jména proměnných | Přepínač -g |
| Lokální proměnné neviditelné | info locals uvnitř funkce |
| Vektor zobrazuje šlamastiku | print vec._M_impl._M_start u starších verzí libstdc++ |
Základní příkazy pro střední vývojáře
Osvojte si těchto 10 příkazů pro 90 % úloh:
r— spuštěníb— zarážkabt— zásobníkn— nexts— stepfin— finishc— continuep— printi locals— lokálníq— ukončení
Co je důležité
- Zásobník volání (bt) vyřeší 70 % segfault za sekundy a ukáže řetězec až k main.
- TUI režim vizualizuje kód a snižuje kognitivní zátěž při složitých projektech.
- -g -O0 jsou povinné; bez nich ladění je bezcenné.
- next vs step je klíčové pro C++ s STL — vyhněte se hlubokému ponoření.
- display a info locals/args vám poskytne plnou kontrolu nad stavem bez nutnosti používat print'y.
— Editorial Team
Zatím žádné komentáře.