6015
Comment:
|
6081
|
Deletions are marked like this. | Additions are marked like this. |
Line 28: | Line 28: |
printk(l'''oglevel''' '''"mesages"'''); '''' |
|
Line 43: | Line 47: |
["http://www.urbanmyth.org/linux/oops/slides.html"] | http://www.urbanmyth.org/linux/oops/slides.html <-- useful link |
What should I have to fix a bug?
- Bug. Well known particular bug.
- A buggy kernel.
- Bit of luck.
Note:
- Having a repeatable bug is more then 50% of success.
- All examples are from 2.6.17.13 (i386)
Function printk().
printk is a very useful function similar to printf(). This function works everywhere and at any time (apart from early stage of booting the kernel when video isn't initialized). It uses log levels to tell the console the importance of each message.
Full list of levels:
KERN_EMERG <-- the most important
- KERN_ALERT
- KERN_CRIT
- KERN_ERR
- KERN_WARNING
- KERN_NOTICE
- KERN_INFO
KERN_DEBUG <-- the least important
The console will print messages only with a level higher than console_loglevel. By default printk uses DEFAULT_MESSAGE_LOGLEVEL == KERN_WARNING (but this may be changed in the future).
printk() uses a cyclic buffer to manage the messages. Next klogd reads the messages (using /proc/kmsg) from the buffer and gives them to syslogd which writes them to /var/log/messages. (You can configure syslogd by editing /etc/syslog.conf).
Examples:
printk(loglevel "mesages");
' From: Linux/arch/mips/mm/tlbex.c From: Linux/arch/mips/sgi-ip27/ip27-berr.c
An oops is report of a bug in the kernel. When an oops occurs the kernel will print what the registers contain and a "back trace". An oops does not mean the system has crashed, as the system can sometimes recover from the error. If the system can not recover from the error then the kernel will panic and stop running. By default the back trace will contain the addresses of the functions that were called. If you compile your kernel with CONFIG_KALLSYMS=y the oops will be decoded and will display the function names. In the 2.4 kernel you can use ksymoops file_with_oops.txt to see the names of the functions. http://www.urbanmyth.org/linux/oops/slides.html <-- useful link
These options are very useful when debugging kernel: CONFIG_PREEMPT=y CONFIG_DEBUG_KERNEL=y CONFIG_KALLSYMS=y CONFIG_SPINLOCK_SLEEP=y CONFIG_MAGIC_SYSRQ=y
if(bad_thing) or BUG_ON(bad_thing); Examples: From: Linux/arch/arm/plat-omap/dma.c if(debug_check) Examples: From: Linux/arch/cris/arch-v32/kernel/dma.c From: Linux/drivers/scsi/hosts.c
If you set CONFIG_MAGIC_SYSRQ=y or typed 'echo 1 > /proc/sys/kernel/sysrq', you can use SysRq Key (on PPC or i386) 'Alt+PrintScreen'. SysRq+h Help SysRq+i Send SysRq+k Kill all tasks ran from this console SysRq+l Send SysRq+m Dump core and show it on console SysRq+o Halt system and shutdown it SysRq+p Print CPU registers on console SysRq+r Change keyboard from RAW to XLATE SysRq+s Save dirty buffers on HDD SysRq+t Show current task info on console SysRq+u Unmount all filesystems, and remount read only Note that every user can use SysRq keys, and it can work improperly on an unstable system.
Linus doesn't want a debugger in the kernel because it can lead to fixing symptoms instead of actually understanding the code and fixing the real problem. However, there are some non-official debuggers (Some require patching the kernel). Note: use + simple to use -you must configure connection +only one computer needed starts on
No one likes bugs. So when you spend hours/days on bug fixing, you may write a short and descriptive email containing your all of the information you have found, and send it to LKML. Good luck with Bug Hunting. 185 if (arg & ~RS_MASK)
186 printk(KERN_WARNING "TLB synthesizer field overflow\n");
37 if (!(errst0 & PI_ERR_ST0_VALID_MASK)) {
38 printk();
39 return;
40 }
Error oops.
Additional compiling options.
Causing errors and printing extra informations.
732 if (omap_dma_in_1510_mode()) {
733 printk(KERN_ERR "DMA linking is not supported in 1510 mode\n");
734 BUG();
735 return;
736 }
1221 BUG_ON(lcd_dma.active);
40 if (options & DMA_PANIC_ON_ERROR)
41 panic("request_dma error!");
398 if (!sht->detect) {
399 printk(KERN_WARNING "scsi_register() called on new-style "
400 "template for driver %s\n", sht->name);
401 dump_stack();
402 }
Magic SysRq Key.
How to use non-exist debugger?
gdb (it is not a patch it is GNU debugger)
kgdb (connect 2 computers, one with kdb and second with gdb)
kdb
oops When everything fail.