Zpět na domů

GDB ladění C++: nalezení segfault za minuty

Průvodce GDB pro vývojáře C++ se zaměřuje na hledání segfault, nastavení zarážek, prohlížení proměnných a TUI režimu. Založeno na reálných příkladech pádů a navigaci v kódu bez překompilací.

GDB v C++: od segfault k rychlému ladění
Advertisement 728x90

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:

Google AdInline article slot
#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 main
  • break program.cpp:42 — na konkrétní řádce
  • break UserData::setName — při vstupu do metody
  • info 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.

Google AdInline article slot

Navigace v kódu:

| Příkaz | Zkratka | Akce |

|---------|------------|----------|

Google AdInline article slot

| 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 ukazatel
  • print vec.size() — volání metody
  • display variable_name — automatické zobrazení po krocích
  • info 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ód
  • layout asm — assembler
  • layout split — kód + assembler
  • layout regs — registry
  • Ctrl + X, 2 — dvě okna
  • Ctrl + X, o — přepnutí mezi okny
  • Ctrl + 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ážka
  • bt — zásobník
  • n — next
  • s — step
  • fin — finish
  • c — continue
  • p — print
  • i 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

Advertisement 728x90

Číst dál