PB173 - Ovladače jádra - Linux III. Ladění jádra Jiri Slabý Fakulta informatiky Masarykova univerzita 8. 10. 2015 Jiri Slabý (Fakulta informatiky, MU) PB173/04 8. 10. 2015 1 /18 Ladění jádra LDD3 kap. 4 (zastaralá) Jak zjistit chybu v jádře • Ladicími výpisy • Výstupem přes soubor (obsah velkých bufferů apod.) • Pád analýza Oops • Regrese =4> git bisect • Automatické nástroje • (Debugger - kgdb a další) Jiri Slabý (Fakulta informatiky, MU) PB173/04 8. 10. 2015 2/18 Sekce 1 Ladění jádra Jiri Slabý (Fakulta informatiky, MU) PB173/04 8. 10. 2015 3/ 18 Výpisy • printk již známe • Před formátovací řetězec se vkládá kern_* • Řetězec ve formě <čísio> nebo \ooičísio • Sděluje úroveň (důležitost) zprávy • Definované V linux/kernel.h Obvyklé nastavení Důležitost Konzole /var/log/* dmesg vysoká ANO ANO ANO normální NE ANO ANO ladicí NE NE ANO zapisuje jádro syslog* jádro Úroveň ovlivňuje, co se kde zobrazí Jiri Slabý (Fakulta informatiky, MU) PB173/04 8. 10. 2015 4/18 Nastavení výpisů • dmesg nastavit nelze • Obsahuje vždy všechno • Nastavení syslogu závislé na systému Nastavení konzole • dmesg -n číslo • Zprávy s vyšší úrovní se objeví na konzol i • Hodnota 8 všechno dění • Např. při „hard-locku" • Demo: pbl73/03 + dmesg -n Jiri Slabý (Fakulta informatiky, MU) PB173/04 8. 10. 2015 5/ 18 Úkol Práce s úrovněmi O Přidejte si do kódu modulu warn_on(i) O Zjistěte s jakou úrovní se varování vypisuje • Pomocí postupného nastavování dmesg -n Jiri Slabý (Fakulta informatiky, MU) PB173/04 8. 10. 2015 6/18 Urověň výpisů Volba úrovně • Nechceme 10G /var/log/messages • Ladicí výpisy: debug • Nechceme spoustu hlášek na konzoli • Obvyklé chyby: warning, err Příklady printk(KERN_EMERG "Thread overran stack, or stack corrupted^"); printk (KERN_ALERT "Unhandled fault: %s (0x%03x) at 0x%08lx\n", ... printk (KERN_CRIT "Invalid DMA channel for ata\n"); printk(KERN_ERR "button.c: Not enough memory\n"); printk (KERN_WARNING "Only using first memory bank\n"); printk(KERN_NOTICE "PCI: Starting initialization.^"); printk(KERNJNFO "SMP mode deactivated.\n"); printk(KERN_DEBUG "cosa%d: microcode started\n", ... Jiri Slabý (Fakulta informatiky, MU) PB173/04 8. 10. 2015 7/18 Cíl výpisů Co vše může být konzole pro výpisy • ttyO-tty* (co když stroj umře?) • Sériová konzole (ttyS*) • Síťová konzole (netconsole) • Všechno, co se zaregistruje pomocí register.consoie Nastavení pomocí parametru jádra (modulu) • console=ttyl • console=ttySO • netconsole=... Documentation/console/console.txt Documentation/serial-console.txt Jiri Slabý (Fakulta informatiky, MU) PB173/04 8. 10. 2015 8/18 Úkol Použití netconsole ve virtuálním stroji O Na hostitelovi: nc -ul 0.0.0.0 60000 O dmesg -n 8 (vypisovat vše) O modinfo netconsole O modprobe netconsole netconsole=@/ens3,60000010.0.2.2/ O Např. echo h >/proc/sysrq-trigger Více informací V Documentation/networking/netconsole.txt Jiri Slabý (Fakulta informatiky, MU) PB173/04 8. 10. 2015 9/18 Nevýhody výpisů • Mnoho dat • Znepřehlednění (typické pro ACPI, iwlwifi) • Nestíhá se posílat na konzoli (ztráta informací) • Částečné řešení (linux/printk. h): if ( printk_ratelimit ()) printk (...) ; • Binární data • dmesg zobrazuje jen textová data • Částečné řešení (linux/kernel. h): print_hex_dump_bytes(...) // Vyžaduje DEBUG print_hex_dump(...) Mnoho binárních dat se předává pomocí speciálních souborů Jiri Slabý (Fakulta informatiky, MU) PB173/04 8. 10. 2015 10/18 Sekce 2 debugfs Jiri Slabý (Fakulta informatiky, MU) PB173/04 8. 10. 2015 11/18 debugfs • Předávání ladicích dat přes soubor • Většinou V /sys/kernel/debug/ • Pokud ne: mount -t debugfs none /sys/kernel/debug/ • Documentation/filesystems/debugfs.txt • 1inux/debugf s.h • debugfs_create_dir, debugf s_create_f ile (f ile_operations), debugfs_create_symlink, debugfs_create_u{8,16,32,bool}, debugfs_remove a debugfs_remove_recursive • Lze Si předat data, JSOU pak V inode->i_private (v open) Jiri Slabý (Fakulta informatiky, MU) PB173/04 8. 10. 2015 12/18 Úkol Vytvoření položek v debugfs O Vytvořit adresář (debugf s_create_dir) O Vytvořit V něm SOUbor (debugf s_create_ul6) • Vrací nějakou hodnotu (např. 11320) Q Přeložit, vložit do Systému (make, insmod) O Přečíst soubor • cat /sys/kernel/debug/