PB173 - Ovladače jádra - Linux in. Jiri Slabý ITI, Fakulta Informatiky 3. 10. 2012 J. Slabý (ITI) PB173/06 3. 10. 2012 1 / 14 Ladění jádra LDD3 kap. 4 (zastaralá) Jak zjistit chybu v jádře o Ladicími výpisy • Výstupem přes soubor (obsah velkých bufferů apod.) • Pád => analýza Oops • Regrese => git bisect • Automatické nástroje • (Debugger - kgdb a další) «... J. Slabý (ITI) PB173/06 3. 10. 2012 2/ 14 Výpisy • printk již známe • Před formátovací řetězec se vkládá kern_* • Řetězec ve formě <čísio> nebo \00ičísio • Sděluje úroveň (důležitost) zprávy • Definované v linux/kernel. h 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 Obvyklé nastavení Úroveň ovlivňuje, co se kde zobrazí J. Slabý (ITI) PB173/06 3. 10. 2012 3/ 14 Nastavení výpisů • dme s g 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 konzoli • Hodnota 8 => všechno dění • Např. při „hard-locku" • Demo: pbl73/03 + dmesg -n 3. 10. 2012 4/ 14 Práce s úrovněmi O Přidejte do kódu warn_on (i) Q Zjistěte s jakou úrovní se varování vypisuje 0 (Pomocí postupného nastavovaní dmesg - Úroveň výpisů a Nechceme 10G /var/log/messages (DEBUG) • Nechceme spoustu hlášek na konzoli (WARNING, ERR) printk (KERN-EMERG "Thread overran stack, or stack corrupted\n") ; 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 .\n") ; printk (KERNJNFO "SMP mode deactivated .\n") ; printk (KERN.DEBUG "cosa%d: microcode started\n", ... J. Slaby (ITI) PB173/06 3. 10. 2012 6/ 14 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*) a Síťová konzole (netconsole) a 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 J. Slabý (ITI) PB173/06 3. 10. 2012 7/ 14 Úkol Použití netconsole ve virtuálním stroji O Na hostovi: nc -ul 0.0.0.0 60000 O dhciient, je-li třeba Q dmesg -n 8 (vypisovat VŠe) O modinfo netconsole Q modprobe netconsole netconsole=@/,60000010.0.2.2/ O Např. echo h >/proc/sysrq-trigger Více informací V Documentation/networking/netconsole. txt J. Slabý (ITI) PB173/06 3. 10. 2012 8/ 14 Nevýhody výpisů a Mnoho dat • Znepřehlednění (typické pro ACPI, iwlwifi) • Nestíhá se posílat na konzoli (ztráta informací) • Řešen/'(Částečné): if (printk_ratelimit () ) printk(); • Binární data • dme s g zobrazuje jen textová data • Řešen/'(Částečné): print_hex_dump_bytes (linux/kernel. h) Mnoho binárních dat se předává pomocí speciálních souborů J. Slabý (ITI) PB173/06 3. 10. 2012 9/ 14 debugfs • Většinou v /sys/kernel/debug/ • Pokud ns:mount -t debugfs none /sys/kernel/debug/ a Documentation/filesystems/debugfs.txt • linux/debugfs.h • debugf s.create.dir, debugf s.create.f ile (f ile_operations), debugf s_cr eat e_syml ink, debugf s_create_u{8, 16, 32,bool}, debugf s.remove o Lze si předat data, jsou pak v inode->i_private v open J. Slabý (ITI) PB173/06 3. 10. 2012 10/14 Úkol Vytvoření položek v debugfs O Vytvořit adresář O Vytvořit v něm soubor (u16) • Vrací např. 11320 0 Přeložit, vložit do systému O Přečíst soubor J. Slabý (ITI) PB173/06 3.10.2012 11 / 14 SysRq • System-request (Alt-PrintScreen) « Funguje (většinou) i po pádu systému • Zapnutí: sysctl kernel. sysrq=l • Documentation/sysrq.txt h zkrácená nápověda r „reset klávesnice" P výpis tras procesů na CPU t výpis tras všech procesů w výpis blokujících procesů s-u-s-b syne + unmount + reboot Příklady SysRq Pozn.: v Qemu lze vyzkoušet v ovládací konzoli (Ctrl-Alt-2) příkazem sendkey alt-sysrq-plsmeno J. Slabý (ITI) PB173/06 3. 10. 2012 12/14 strace • Chci-li znát komunikaci jádro o program • man strace • Zachytává syscally • Vypisuje jejich parametry na STDOUT Demo:strace -e open,read cat .../debug/... J. Slabý (ITI) PB173/06 3. 10. 2012 13/14 Analýza Oops my.init (void) { char *ptr = (void *)5; *ptr = 5; } BUG: unable to handle kernel NULL pointer dereference at 00000000000005 IP: [] my_init+0x12/0x30 [pt>173] PGD 3daff067 PUD 3c713067 PMD 0 Oops: 0002 [#1] SMP last sysfs file: / sys/devices/system/.. . CPU 0 Modules linked in: pb173( + ) mperf fuse ... Pid: 2506, comm: insmod Not tainted 2.6.36-rc4-16-default #1 /Bochs RIP: 0010:[< f f f f f f f f a 0 0 3 9 0 4 2 >] [< f f f f f f f f a 0 0 3 9 0 4 2 >] my_init+0x12/0x30 [pb173] RSP: 0018:ffff88003c741 f28 EFLAGS: 00010292 RAX: 0000000000000017 RBX: ffffffffa0039 1 80 RCX: 0000000000000e91 CR2: 0000000000000005 CR3: 000000003bb47000 CR4: 00000000000006fO Process insmod (pid: 2506, ...) Stack: ... Call Trace: [] do.oneJnitcall+0x3a/0x170 [< ffffffffS 1 08f69a >] sys.init.module+0xba/0x210 [< ffffffffS 1 002efb >] system.call.fastpath+0x16/0x1b [<00007fc3386320ba>] 0x7fc3386320ba Code: ... e8 63 c8 41 e1 04 25 05 00 00 ... J. Slaby (ITI) PB173/06 3. 10. 2012 14/14