PB173 - Binární programování Linux VIII. Ladění Jiri Slabý Fakulta informatiky Masarykova univerzita 11.11.2014 Jiri Slabý (Fakulta informatiky, MU) PB173/03 11.11. 2014 1 /16 Techniky ladění Z pohledu vykonávání O Staticky • Spouštím analyzátor a ten hledá nesrovnalosti • Analýza ukazatelů, hodnot, velikosti zásobníku, ... • Není cílem cvičení, ale formela O Dynamicky • Spouštím na CPU a očekávám výsledek • Testování • Vyzkoušíme si dnes a příště Jiri Slabý (Fakulta informatiky, MU) PB173/03 11.11. 2014 2/16 Techniky ladění Z pohledu cíle Q Ladění funkčnosti (dnes) • Obrazy paměti • Tracery • valgrind Příště • Pokračování s gdb • Ladění výkonnosti/velikosti • Optimalizace kódu o Odstranění nepoužitého kódu Jiri Slabý (Fakulta informatiky, MU) Sekce 1 Ladění funkčnosti (dnes) Jiri Slabý (Fakulta informatiky, MU) PB173/03 11.11. 2014 4/16 Ladění funkčnosti • Výpisy • printf a příbuzné • Monitor chování • gdb, ltrace, strace, valgrind, • Post-mortem • core soubor (obraz paměti) Jiri Slabý (Fakulta informatiky, MU) Debugger gdb « Pracuje s ELFem a DWARFem • 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/03 11.11. 2014 6/16 Příkazy gdb 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/03 11.11. 2014 7/16 Příkazy gdb Výpisy • Zásobník volání: where • Pohyb po rámcích zásobníku: up, down • Programu: list (jen s ladicími informacemi) • Assembleru: disassemble • Paměti: print • HexDump: x • Ostatní: inf o registers, inf o break, ... Většina příkazů akceptuje parametry - výpis lokací, proměnných, registrů atd. Jiri Slabý (Fakulta informatiky, MU) PB173/03 11.11. 2014 8/16 Úkol Výpisy v gdb O Přeložte Si pbl73-bin/08/ O Spusťte debug (mělo by dojít k pádu) 0 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) a Disassembly (disassemble s parametrem adresa) • Proměnnou b (print b) • Proměnnou argc V main (up a print argc) Jiri Slabý (Fakulta informatiky, MU) PB173/03 11.11. 2014 9/16 Příkazy gdb Breakpointy • Příkaz: break • Parametr • Adresa 9 Funkce • soubonradek • ... Úkol 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/03 11.11. 2014 10/16 Obrazy paměti a gdb • Jádro při pádu zapíše obraz paměti („coredump") • Nutno zvýšit limit velikosti (bývá 0): ulimit -c • Cíl, kam se ukládají: sysctl kernel. core_pattern a Potom se dá analyzovat v gdb • gdb --core=core_soubor --args binarka --volby_binarky Jiri Slabý (Fakulta informatiky, MU) PB173/03 11.11. 2014 11 /16 Ú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 O Otevřete v gdb s obrazem paměti (gdb --core= . /debug) O Vypište si podobné informace jako předtím • where • print b 9 A podobně Jiri Slabý (Fakulta informatiky, MU) PB173/03 11.11. 2014 12/16 Tracery o Sledují události a vypisují je • ltrace: sleduje knihovní volání • strace: sleduje systémová volání a Používají systémové volání ptrace • ltrace si nastaví breakpointy na všechny externí symboly z ELFu • strace jednoduše použije PTRACE_SYSCALL • Spuštění: {s,l}trace binarka --volby • Další parametry • -e: filtr (-e write) • -f: sleduje i potomky • -o: výstup do souboru Jiri Slabý (Fakulta informatiky, MU) PB173/03 11.11. 2014 13/16 Úkol Práce s tracery O Projděte Si pbl73-bin/08/tracer.c O Spusťte nejdříve s ltrace • Kolik je volání f write do libc? Q Spusťte S strace • Kolik je volání write do jádra? • libc bufferuje O Pomocí ltrace zjistěte, jak velký buffer libc používá a V cyklu vypisujte znak pomocí f write • Použijte volbu -S Q Pomocí strace ověřte totéž • Pozorujte třetí parametr write Jiri Slabý (Fakulta informatiky, MU) PB173/03 11.11. 2014 14/16 valgrind • Sleduje (zejména) operace s pamětí (Memcheck) • Úniky paměti • Neinicializované a nezarovnané přístupy • Použití paměti po f ree «... a Několik dalších modulů o Callgrind: profiluje cache CPU • Massif: profiluje použití haldy • Další pro problémy se zámky atd. • Spuštění: valgrind --volby_valgrindu binarka --volby_binarky • Další parametry • —tool: výběr nástroje shora • — leak-check: sledovat úniky paměti Jiri Slabý (Fakulta informatiky, MU) PB173/03 11.11. 2014 15/16 Úkol Práce s nástrojem vaigrind O Projděte Si pbl73-bin/08/memcheck.c O Spusťte v nástroji vaigrind O Řiďte se pokyny na konci výpisu • Vypište si všechny podrobnosti • Přidáváním navržených parametrů („Rerun with") Jiri Slabý (Fakulta informatiky, MU) PB173/03 11.11. 2014 16/16