PB173 - Binární programování Linux IX. Gdb a ladění výkonnosti Jiri Slabý Fakulta informatiky Masarykova univerzita 3. 12. 2015 Jiri Slabý (Fakulta informatiky, MU) PB173/05 3. 12. 2015 1 /20 Ladění Minule • Ladění funkčnosti O Sdb • Obrazy paměti Q Ladění výkonnosti • Profilování • Pokrytí kódu Jiri Slabý (Fakulta informatiky, MU) PB173/05 3.12.2015 2/20 Sekce 1 gdb Jiri Slabý (Fakulta informatiky, MU) PB173/05 3. 12. 2015 3/20 Debugger gdb • Pracuje s ELFem a DWARFem • DWARF není nutný, ale usnadňuje ladění • Používá systémové volání ptrace • Sleduje proces • Upravuje vykonávání • Čte a mění paměť • ... • Podpora Python skriptů • Spuštění: gdb --volby_gdb --args binarka --volby_binarky • Nápověda:help • Manuál: GDB User Manuál Jiri Slabý (Fakulta informatiky, MU) PB173/05 3. 12. 2015 4/20 gcc a gdb • gcc generuje různé úrovně ladicích informací • -gi (méně informací) • -g2 alias -g • -g3 (navíc informace o makrech) • -ggdb (i v kombinaci s -g) • gcc použije i gdb rozšíření, pokud možno • S optimalizacemi se ladí se obtížněji • Proměnné zmizely, konstanty se propagovaly, ... • Ale bez optimalizací je pomalý kód • Někdy i nepřeložitelný • V gcc 4.8 se objevilo -Og • Zapíná jen optimalizace, které (příliš) neztěžují ladění o Nezapína samotnou generaci ladicích informací! • Používá se v kombinaci s -g... Demo: makra, gdb a pbi73-bin/io/mac. c Jiri Slabý (Fakulta informatiky, MU) PB173/05 3. 12. 2015 5/20 Operace s během • Spustit: run • Spustit po main: start • Přerušit: signálem (např. Ctrl-c) • Pokračovat po návrat z funkce: finish • Pokračovat: continue • Krokovat s vnořením: step (po řádcích), stepi (po instrukcích) • Krokovat bez vnoření: next (po řádcích), nexti (po instrukcích) • Konec:quit • Opakování předchozího příkazu: ENTER Úkol: spusťte si yes v gdb a přerušte. Vyzkoušejte si finish a continue. Zkuste krokovat po instrukcích hlavní cyklus yes. Poté quit. Jiri Slabý (Fakulta informatiky, MU) PB173/05 3. 12. 2015 6/20 Výpisy I Výpis • Zásobníku volání: where • Pohyb po rámcích zásobníku: up, down • Zdrojového kódu: list (jen pokud máme DWARF) • Assembleru: disassemble • Ostatní: inf o registers, inf o break, inf o macro, ... Většina příkazů akceptuje parametry - výpis lokací, funkcí, proměnných, registrů atd. Jiri Slabý (Fakulta informatiky, MU) PB173/05 3. 12. 2015 7/20 Úkol Výpisy v gdb O Přeložte Si pbl73-bin/10/ O Spusťte debug (mělo by dojít k pádu) O Otevřete debug v gdb O Spusťte (run) O Prohlédněte si, kde došlo k pádu (vypište): • Zásobník volání (where) • Místo pádu (list s parametrem soubor: radek) • Disassembly (disassemble s parametrem adresa) Jiri Slabý (Fakulta informatiky, MU) PB173/05 3. 12. 2015 8/20 Výpisy II. • Dump (x) a print (p) • Lze použít s formátováním (x/f a p/f, kde f je formát) • Formát jsou tři hodnoty O Počet vypisovaných hodnot O Formát vypisovaných hodnot o x: hexa (podobně jako printf) • d: decimálně • u: decimálně bez znaménka • s: řetězec • a: adresa • i: instrukce • Ostatní: viz help x O Velikost skupiny • b: 1 bajt (0x00 0x00 0x00 0x00) • h: 2 bajty (Oxoooo Oxoooo) 9 w: 4 bajty (Oxoooooooo) • g: 8 bajtů (...) Jiri Slabý (Fakulta informatiky, MU) PB173/05 3. 12. 2015 9/20 Úkol Výpisy O Otevřete si znovu program debug v gdb O Spusťte (start) O Vypište • Adresu aktuální instrukce (p/a $pc) • 20 instrukcí od aktuální (x/20i $pc) • 32 hexa byte hodnot na zásobníku ($sp) • 8 hexa giant hodnot na zásobníku O Pokuste se najít na zásobníku adresu, kam se vrátí po ret 0 Proměnnou b (print b) O Proměnnou argc V main (up a print argc) Jiri Slabý (Fakulta informatiky, MU) PB173/05 3. 12. 2015 10/20 Breakpointy • Zastavení vykonávání v definovaném bodě • Příkaz: break • Parametr • Adresa • Funkce • soubor:radek Ukol O Přidejte breakpoint na začátek main a spusťte (run) O Krokujte až k pádu (next) O Zopakujte pro step a také stepi Jiri Slabý (Fakulta informatiky, MU) PB173/05 3. 12. 2015 11/20 Další informace • Spousta dalších informací v info • functions, types, variables, local • sources, line, macros, scope • symbol • threads • Další viz help info Demo (pb173-bin/10/thread.c) Jiri Slabý (Fakulta informatiky, MU) PB173/05 3. 12. 2015 12/20 Změna běhu set, set variable Registry procesoru: $rax, $rbx, ... Proměnné gdb: $pc, $sp, ... Vnitřní proměnné: $ostatni • Pro vlastní použití Paměť: {typ}adresa Jiri Slabý (Fakulta informatiky, MU) PB173/05 3. 12. 2015 13/20 Obrazy paměti • Jádro může při pádu zapsat obraz paměti („coredump") • Výhoda: žádné zpomalení běhu • Nevýhoda: proces je mrtvý, nelze krokovat apod. • Nutno zvýšit limit velikosti (bývá 0): ulimit -c • Cíl, kam se ukládají: sysctl kernel. core_pattern • Potom se dá analyzovat v gdb • gdb binarka core_soubor Jiri Slabý (Fakulta informatiky, MU) PB173/05 3. 12. 2015 14/20 Úkol Práce s obrazem paměti O Nastavte limit na obrazy na unlimited (ulimit -c) O Podívejte se, kam se Obraz uloží (sysctl kernel. core_pattern) O Spusťte program z předchozího příkladu • Pád by měl vygenerovat coredump O Otevřete v gdb s obrazem paměti (gdb ./debug path_to_core) 0 Vypište si podobné informace jako předtím • where • print b • A podobně Jiri Slabý (Fakulta informatiky, MU) PB173/05 3. 12. 2015 15/20 Sekce 2 Ladění výkonnosti Jiri Slabý (Fakulta informatiky, MU) PB173/05 3. 12. 2015 16/20 Profilování Co zabírá nejvíce času při vykonávání? O gprof • Při překladu: gcc -pg ... • Potom se program spustí a data se uloží na disk • gprof data načte a zobrazí O perf • Používá čítače v procesoru (nutná podpora CPU) • Zahrnuje ve výpisech chování jádra • Umí pracovat s gcc -pg binárkami • Spuštění: perf record -g -- binarka --volby • Dokumentace: http: //perf . wiki . kernel. org Jiri Slabý (Fakulta informatiky, MU) PB173/05 3. 12. 2015 17/20 Úkol Profilování O Projděte Si pbl73-bin/10/prof . c O Spusťte prof.pg O Prostudujte výstup gprof -b prof _pg O Nahrajte si výstup perf • perf record -g prof O Zobrazte si výstup • perf report -g O Zopakujte perf pro prof _pg Jiri Slabý (Fakulta informatiky, MU) PB173/05 3. 12. 2015 18/20 Pokrytí kódu Která část kódu se vůbec nevykonává? • gcov • Při překladu: gcc --coverage . . . • Potom se program spustí a data se uloží na disk • gcov data načte a zapíše cov. c. gcov Jiri Slabý (Fakulta informatiky, MU) PB173/05 3. 12. 2015 19/20 Úkol Pokrytí kódu O Projděte Si pbl73-bin/10/cov.c O Spusťte cov O Prostudujte výstup gcov cov O Prostudujte cov.c.gcov Jiri Slabý (Fakulta informatiky, MU) PB173/05 3. 12. 2015 20/20