PB173 - Ovladače jádra - Linux III. Ladění jádra Jiri Slabý Fakulta informatiky Masarykova univerzita 4. 10. 2016 Jiri Slabý (Fakulta informatiky, MU) PB173/04 4. 10. 2016 1/19 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 => git bisect o Automatické nástroje • (Debugger - kgdb a další) • ... Jiri Slabý (Fakulta informatiky, MU) PB173/04 4. 10. 2016 2/19 Sekce 1 Ladění jádra Jiri Slabý (Fakulta informatiky, MU) PB173/04 4.10.2016 3/19 Výpisy • printk již známe • Před formátovací řetězec se vkládá kern_* • Řetězec ve formě nebo \ooicisio • Sděluje úroveň (důležitost) zprávy • Definované V linux/kernel. h • Zkratky: pr_err, pr_inf o, ... Jiri Slabý (Fakulta informatiky, MU) PB173/04 4. 10. 2016 4/19 Nastavení výpisů Úroveň ovlivňuje, co se kde zobrazí • dmesg nastavit nelze • Obsahuje vždy všechno • Nastavení /var/log/* (syslogu) závislé na systému Obvyklé nastavení Důležitost Cíl dmesg /var/log/* Konzole KERN.EMERG / / / KERN.INFO / / X KERN.DEBUG / X X Zapisuje: jádro syslog* jádro Jiri Slabý (Fakulta informatiky, MU) PB173/04 4.10.2016 5/19 Nastavení konzole • Příkazem: dmesg -n cislo • Zprávy s vyšší úrovní se objeví na konzoli o Vyšší úroveň = nižší číslo o Hodnota 8 (debug) => všechno dění • Např. při „hard-locku" Demo: pbl73/03 + dmesg -n Jiri Slabý (Fakulta informatiky MU) PB 173/04 4. 10. 2016 6/19 Ú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 4. 10. 2016 7/19 Úroveň výpisů Volba úrovně Nechceme 10G /var/log/messages • Ladicí výpisy: kern_debug • Nechceme spoustu hlášek na konzoli • Obvyklé chyby: kern_warning, kern_err Příklady printk(KERN_EMERG "Thread overran stack, or stack corruptees"); 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 initializationAn"); printk(KERN_INFO "SMP mode deactivatedAn"); printk(KERN_DEBUG "cosa%d: microcode started\n", ... Jiri Slabý (Fakulta informatiky, MU) PB173/04 4. 10. 2016 8/19 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 4.10.2016 9/19 Úkol Použití netconsole ve virtuálním stroji O Na hostitelovi: nc -ul 0.0.0.0 60000 Q 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 4. 10. 2016 10/19 Nevýhody výpisů • Mnoho dat 9 Znepřehlednění (typické pro ACPI, iwlwifi) 9 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 4. 10. 2016 11/19 Sekce 2 debugfs Jiri Slabý (Fakulta informatiky MU) PB173/04 4. 10. 2016 12/19 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 • linux/debugfs.h • Vytvoření 9 Adresář: debugf s_create_dir • Symbolický odkaz: debugf s_create_symlink • Vystavit proměnnou: debugf s_create_u{8,16,32,bool} • Celé file_operations: debugfs_create_file • Lze Si předat data, JSOU pak V open V inode->i_private • Smazání • 1 položka: debugf s_remove • Celý podstrom: debugf s_remove_recursive Jiri Slabý (Fakulta informatiky, MU) PB173/04 4.10.2016 13/19 Úkol Vytvoření položek v debugfs O Vytvořte adresář (debugf s_create_dir) © Vytvořte V něm SOUbor (debugf s_create_ul6) • Vrací nějakou hodnotu (např. 11320) O Přeložte, Vložte do Systému (make, insmod) O Přečtěte soubor • cat /sys/kernel/debug// Jiri Slabý (Fakulta informatiky MU) PB173/04 4. 10. 2016 14/19 Sekce 3 sysrq + strace Jiri Slabý (Fakulta informatiky MU) PB173/04 4. 10. 2016 15/19 SysRq o 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 Příklady SysRq 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 Jiri Slabý (Fakulta informatiky MU) PB173/04 4. 10. 2016 16/19 Úkol Sysrq O Vypište si nápovědu (sysrq-h) O Vypište si trasy procesů na CPU (sysrq-p) O 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ísměno Jiri Slabý (Fakulta informatiky MU) PB173/04 4. 10. 2016 17/19 strace Chci-li znát komunikaci jádro ^ program • man strace Zachytává syscally • Dekóduje a vypisuje jejich parametry na STDOUT Demo: strace -e open,read cat . . ./debug/. . . Jiri Slabý (Fakulta informatiky MU) PB 173/04 4. 10. 2016 18/19 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 Modules linked in: pb173(+) mperf fuse ... Pid: 2506, comm: insmod Not tainted 2.6.36-rc4-16-default #1 /Bochs RIP: 0010:[] [< ffffffffa0039042 >] my_init+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 >] sys_init_module+0xba/0x210 [< ffffffff81002efb >] system_call_fastpath+0x16/0x1 b [<00007fc3386320ba>] 0x7fc3386320ba Code: ... e8 63 c8 41 e1 04 25 05 00 00 ... Jiri Slabý (Fakulta informatiky, MU) PB173/04 4. 10. 2016 19/19