PB173 - Ovladače jádra - Linux III. Ladění jádra Jiri Slabý ITI, Fakulta informatiky 1. 10. 2013 J. Slabý (ITI, Fl) PB173/02 1. 10. 2013 1 /15 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, Fl) PB173/02 1. 10. 2013 2/ 15 Výpisy • printk již známe a 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 o 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, Fl) PB173/02 1. 10. 2013 3/ 15 Nastavení výpisů • dmesg nastavit nelze 9 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: pb!73/03 + dmesg -n J. Slabý (ITI, Fl) Úkol Práce s úrovněmi O Přidejte si do kódu modulu warn_dn(D O Zjistěte s jakou úrovní se varování vypisuje • Pomocí postupného nastavování dmesg -n J. Slabý (ITI, Fl) Úroveň 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\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, Fl) PB173/02 1. 10. 2013 6/ 15 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 J. Slabý (ITI, Fl) PB173/02 1. 10. 2013 7/ 15 Úkol Použití netconsole ve virtuálním stroji O Na hostitelovi: ne -ui o.o.o.o 60000 O dmesg -n 8 (vypisovat vše) O modinfo netconsole O 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, Fl) PB173/02 1. 10. 2013 8/ 15 Nevýhody výpisů • Mnoho dat • Znepřehlednění (typické pro ACPI, iwlwifi) 9 Nestíhá se posílat na konzoli (ztráta informací) o Částečné řešení(linux/printk.h): if ( printk.ratelimit ()) printk (...) ; • Binární data a dmesg zobrazuje jen textová data • Částečné řešení(íinux/kemei.h): print.hex.dump.by1es(...) Mnoho binárních dat se předává pomocí speciálních souborů J. Slabý (ITI, Fl) PB173/02 1. 10. 2013 9/ 15 debugfs a Předávání ladicích dat přes soubor • Většinou V /sys/kernel/debug/ • Pokud ns: mount -t debugfs none /sys/kernel/debug/ • Documentation/filesystems/debugfs.txt a linux/debugfs.h • debugfs_create_dir, debugfs_create_file (file_operations), debugfs_create_symlink, debugfs_create_u{8,16,32,bool]-, debugf s_remove a Lze Si předat data, JSOU pak V inode->i_private (v open) J. Slabý (ITI, Fl) PB173/02 1. 10. 2013 10/15 Ú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, Fl) PB173/02 1.10.2013 11 / 15 SysRq • System-request (Documentation/sysrq.txt) • Klávesnicí: Alt-PrintScreen • Vzdáleně:/proc/sysrq-trigger • Funguje (většinou) i po pádu systému • Zapnutí: sysctl kernel.sysrq=l 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 J. Slabý (ITI, Fl) PB173/02 1. 10. 2013 12/15 Úkol Sysrq O Vypište si nápovědu (sysrq-h) Q Vypište si trasy procesů na CPU (sysrq-p) 0 Vypište si informace o paměti (sysrq-m) Pozn.: v Qemu lze vyzkoušet v ovládací konzoli (Ctrl-Alt-2) příkazem sendkey alt-sysrq-písmeno J. Slabý (ITI, Fl) PB173/02 1. 10. 2013 13/15 strace • Chci-li znát komunikaci jádro o program • man strace • Zachytává syscally « Dekóduje a vypisuje jejich parametry na STDOUT Demo: strace -e open,read cat .../debug/... J. Slaby (ITI, Fl) PB173/02 1. 10. 2013 14/15 Analýza Oops my.init(void) { char *ptr = (void *)5; *ptr = 5; } BUG: unable to handle kernel NULL pointer dereference at 00000000000005 IP: [< ffffffffa0039042 >] my_init+0x12/0x30 [pb173] 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:[] [< ffffffffa0039042 >] myjnit +0x12/0x30 [pb173] RSP: 0018:ffff88003c741f28 EFLAGS: 00010292 RAX: 0000000000000017 RBX: ffffffffa0039180 RCX: 0000000000000e91 CR2: 0000000000000005 CR3: 000000003bb47000 CR4: 00000000000006f0 Process insmod (pid: 2506, ...) Stack: ... Call Trace: [< ffffffff810002da >] do-one-initcall +0x3a/0x170 [< ffffffff8108f69a >] sysJnrLmodule+0xba/0x210 [< ffffffff81002efb >] system.calLfastpath+0x16/0x1 b [<00007fc3386320ba>]0x7fc3386320ba Code: ... e8 63 c8 41 e1 04 25 05 00 00 ... J. Slaby (ITI, Fl) PB173/02 1. 10. 2013 15/15