PB173 - Binární programování Linux IX. Ladění Jiri Slabý Fakulta informatiky Masarykova univerzita 26. 11. 2015 Jiri Slabý (Fakulta informatiky, MU) PB173/05 26. 11. 2015 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 Q 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/05 26. 11. 2015 2/16 Techniky ladění Z pohledu cíle Q Ladění funkčnosti (dnes) • Tracery • ptrace • 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) PB173/05 26.11.2015 3/ 16 Sekce 1 Ladění funkčnosti (dnes) Jiri Slabý (Fakulta informatiky, MU) PB173/05 26. 11. 2015 4/16 Ladění funkčnosti • Výpisy • printf a příbuzné • Monitorování chování • gdb, ltrace, strace, valgrind, • Post-m o rtem • core soubor (obraz paměti) Jiri Slabý (Fakulta informatiky, MU) PB173/05 26. 11. 2015 5/ 16 Tracery • Sledují události a vypisují je • ítrace: sleduje knihovní volání • strace: sleduje systémová volání • Používají systémové volání ptrace • ítrace 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/05 26. 11. 2015 6/16 Úkol Práce s tracery O Projděte Si pbl73-bin/09/tracer.c O Spusťte nejdříve s ltrace • Kolik je volání f write do libc? O 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á • V cyklu vypisujte znak pomocí f write • Použijte volbu -s O Pomocí strace ověřte totéž • Pozorujte třetí parametr write Jiri Slabý (Fakulta informatiky, MU) PB173/05 26. 11. 2015 7/16 ptrace • sys/ptrace.h • Systémové volání ke sledování procesů • Naváže se na proces • Ovládá ho • ptrace(enum __ptrace_request r, pid_t p, void *addr, void *data) • r - co chceme • p - na kom to chceme provést o addr a data - význam závisí na hodnotě request Jiri Slabý (Fakulta informatiky, MU) PB173/05 26. 11. 2015 8/16 ptrace Navázání Dvě možnosti O Svého potomka • Potomek: ptrace (ptrace.traceme) a raise(sigstop) • Rodič: waitpid a ptrace (neco), např. ptrace.cont • waitpid počká na raise potomka, který už je p-trasovatelný O Cizí proces • Trasovač: ptrace(ptrace.attach, pid) a waitpid • Nastaví pid p-trasovatelný, pošle sigstop, waitpid na signál počká Odpojení zastaveného trasovaného ptrace(PTRACE.DETACH, pid) Jiri Slabý (Fakulta informatiky, MU) PB173/05 26. 11. 2015 9/16 Úkol Trasování potomka O Proveďte f or k O Potomek • Nastavte jej p-trasovatelného • Něco vypište o Pošlete mu signál • Něco vypište O Rodič • Počkejte na zastaveného potomka • Čekejte na standardní vstup • Něco vypište • Odpojte potomka • Něco vypište O Vyzkoušejte Jiri Slabý (Fakulta informatiky, MU) PB173/05 26.11.2015 10/ 16 ptrace Krokování • ptrace (ptrace.cont) - pokračuj ve vykonávání • Přerušení klasickým kili • ptrace (ptrace.syscall) - do příštího systémového volání • ptrace (ptrace_singlestep) - jedna instrukce • Vždy je třeba počkat na signál od potomka Jiri Slabý (Fakulta informatiky, MU) PB173/05 26. 11. 2015 11/16 Úkol Krokování potomka O V rodiči v cyklu: • Čekejte na standardní vstup • Krokujte potomka po instrukci O Nezapomeňte ošetřit stav, kdy potomek skončil O Vyzkoušejte Jiri Slabý (Fakulta informatiky, MU) PB173/05 26. 11. 2015 12/16 ptrace Manipulace s procesem • ptrace(ptrace.peektext) - přečti kód • ptrace (ptrace.peekdata) - přečti data • ptrace (ptrace.peekuser) - přečti registr,... • ptrace (ptrace_getregs) - přečti registry • struct user_regs_struct • ptrace (ptrace.getfpregs) - přečti plovoucí desetinné registry • struct user_fpregs_struct • set* a poke* varianty Jiri Slabý (Fakulta informatiky, MU) PB173/05 26. 11. 2015 13/16 Úkol Manipulace s procesem O V rodiči v cyklu navíc: • Vypište adresu aktuálně zastavené instrukce • První byte instrukce O Vyzkoušejte Jiri Slabý (Fakulta informatiky, MU) PB173/05 26. 11. 2015 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 • ... • Několik dalších modulů • 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/05 26. 11. 2015 15/16 Úkol Práce s nástrojem valgrind O Projděte Si pbl73-bin/09/memcheck. c O Spusťte V nástroji valgrind 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/05 26. 11. 2015 16/16