PB173 - Binární programování Linux X. Gdb a ladění výkonnosti Jiri Slabý Fakulta informatiky Masarykova univerzita 22. 11. 2016 Jiri Slabý (Fakulta informatiky, MU) PB173/05 22. 11. 2016 1 120 Ladění Minule • Ladění funkčnosti ptrace, tracery, ... O Sdb • Obrazy paměti Q Ladění výkonnosti • Profilování Pokrytí kódu Jiri Slabý (Fakulta informatiky, MU) PB173/05 22. 11. 2016 2120 Sekce 1 gdb Jiri Slabý (Fakulta informatiky, MU) PB173/05 22. 11. 2016 3/20 Debugger gdb • Pracuje s ELFem a DWARFem • DWARF není nutný, ale usnadňuje ladění 9 Používá systémové volání ptrace • Sleduje proces • Upravuje vykonávání Čte a mění paměť «... o 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 22. 11. 2016 4/20 gcc a gdb • gcc generuje různé úrovně ladicích informací • -gl (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 • Demo: makra, gdb a pbi73-bin/io/mac. c • S optimalizacemi se ladí se obtížněji 9 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 (00 < 0g < 01) Zapíná jen optimalizace, které (příliš) neztěžují ladění • Nezapína samotnou generaci ladicích informací! • Používá se v kombinaci s -g... • Demo: gcc -Q --help=optimizers -Og Jiri Slabý (Fakulta informatiky, MU) PB173/05 22. 11. 2016 5 / 20 Operace s během • Spustit: run • Spustit po main: start • Nutné ladicí informace • 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) 9 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 22. 11. 2016 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 • Nutné ladicí informace a zdrojový kód • Assembleru: disassemble • Ostatní: info registers, info break, info macro, ... Většina příkazů má parametry - výpis lokací, funkcí, proměnných, registrů atd. Jiri Slabý (Fakulta informatiky, MU) PB173/05 22. 11. 2016 7/20 Úkol Výpisy v gdb Přeložte Si pbl73-bin/10/debug.c O Spusťte ./debug • Mělo by dojít k pádu O Otevřete debug v gdb O Spusťte (run) 0 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 22. 11. 2016 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 Počet vypisovaných hodnot O Formát vypisovaných hodnot x: hexa (podobně jako print f) o 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) • w: 4 bajty (Oxoooooooo) • g: 8 bajtu (...) Jiri Slabý (Fakulta informatiky MU) PB173/05 22. 11. 2016 9 / 20 Úkol Výpisy O Otevřete si znovu program debug v gdb O Spusťte po pád (run) 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 O Proměnnou b (print b) O Proměnnou argc V main (up a print argc) Jiri Slabý (Fakulta informatiky, MU) PB173/05 22. 11. 2016 10/20 Breakpointy o Zastavení vykonávání v definovaném bodě • Příkaz: break • Parametr • Adresa • Funkce • soubor:radek «... Úkol O Přidejte breakpoint na začátek main a spusťte (run • Vyzkoušejte alespoň 2 způsoby O Krokujte až k pádu (next) O Zopakujte pro step a také stepi Jiri Slabý (Fakulta informatiky MU) PB173/05 22. 11. 2016 11 / 20 Další informace • Spousta dalších informací v info • functions, types, variables, locals • sources, line, macros, scope • symbol threads • Další viz help info Demo: thread a pbl73-bin/10/thread.c Jiri Slabý (Fakulta informatiky, MU) PB173/05 22. 11. 2016 12/20 Změna běhu 9 set, set variable • Registry procesoru: $rax, $rbx, ... • Proměnné gdb: $pc, $sp, ... • Vnitřní proměnné: $ostatni • Pro vlastní použití 9 Paměť: {typ}adresa Demo: thread a parm Jiri Slabý (Fakulta informatiky, MU) PB173/05 22. 11. 2016 13/20 Obrazy paměti 9 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 o Potom se dá analyzovat v gdb • gdb binarka core_soubor Jiri Slabý (Fakulta informatiky, MU) PB173/05 22.11.2016 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) O Vypište si podobné informace jako předtím • where • print b • A podobně Jiri Slabý (Fakulta informatiky MU) PB173/05 22. 11. 2016 15/20 Sekce 2 Ladění výkonnosti Jiri Slabý (Fakulta informatiky MU) PB173/05 22. 11. 2016 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 i chování jádra • Umí pracovat s gcc -pg binárkami • Spuštění: perf record -g -- binarka --volby 9 Dokumentace: http: //perf . wiki . kernel. org Jiri Slabý (Fakulta informatiky MU) PB173/05 22. 11. 2016 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 záznam z 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 22. 11. 2016 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 22. 11. 2016 19/20 Úkol Pokrytí kódu 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 22. 11. 2016 20/20