- 内核代码错误难以重现。 因为他们会牵连整个系统和他们一起失效,从而破坏了大量可以用来追踪错误的证据。
- 内核中的调试选项都集成在“Kernel hacking” 菜单。
- CONFIG_DEBUG_KERNEL
总开关,使得其他的调试选项可用 - CONFIG_DEBUG_SLAB
内存分配函数的检查选项,用以检测内存覆盖和遗漏初始化错误。被分配的每个字节在递交给调用者之前都设成0xa5,释放时被设成0x6b, 这样在OOPS的错误中就可以明确是否是此类错误。 同时此选项还会在内存对象的前后放置特别的守护值,如果这些值被改动则说明存在内存覆盖的现象,内核会给与提示。 - CONFIG_DEBUG_SPINLOCK
捕捉自旋锁操作的异常, 如未初始化和2次解锁 - CONFIG_DEBUG_SPINLOCK_SLEEP
激活对持有自旋锁的对象进入睡眠的检查。 - CONFIG_INIT_DEBUG
激活对__init / __initdata / __devinit 的代码检查。 - CONFIG_DEBUG_INFO
使得内核在编译时包含有完整的调试信息。 可以配置CONFIG_FRAME_POINTER,这样就可以使用gdb进行内核调试了。 - CONFIG_MAGIC_SYSRQ
激活 Magic SysRQ 键 - CONFIG_DEBUG_STACKOVERFLOW
跟踪堆栈溢出以得到一个OOPS输出。 - CONFIG_KALLSYMS
使得内核符号信息建立在内核中,这样OOPS才会显示出有效的信息。 - CONFIG——DEBUG——DRIVER
在《Device drivers> 菜单下,打开驱动核心的调试信息。可用于追踪底层的支持代码。 - CONFIG——INPUT——EVBUG
打开输入事件的详细日志 - CONFIG_PROFILING
剖析系统性能。 - 打印调试 printk
- KERN_EMERG
用于紧急消息, 常常是那些崩溃前的消息.
- KERN_ALERT
需要立刻动作的情形.
- KERN_CRIT
严重情况, 常常与严重的硬件或者软件失效有关.
- KERN_ERR
用来报告错误情况; 设备驱动常常使用 KERN_ERR 来报告硬件故障.
- KERN_WARNING
有问题的情况的警告, 这些情况自己不会引起系统的严重问题.
- KERN_NOTICE
正常情况, 但是仍然值得注意. 在这个级别一些安全相关的情况会报告.
- KERN_INFO
信息型消息. 在这个级别, 很多驱动在启动时打印它们发现的硬件的信息.
- KERN_DEBUG
用作调试消息.
每个字串( 在宏定义扩展里 )代表一个在角括号中的整数. 整数的范围从 0 到 7, 越小的数表示越大的优先级.
- 一条没有指定优先级的 printk 语句缺省是 DEFAULT_MESSAGE_LOGLEVEL, 在 kernel/printk.c 里指定作为一个整数.
- 内核中变量 console_loglevel 默认为 DEFAULT_CONSOLE_LOGLEVEL, 可以通过sys_syslog 这个系统调用进行修改,也可以通过klogd的命令行参数 -c 设定。
- 当printk指定的优先级小于console_loglevel时,消息才会投递到控制台。
- 当系统中运行有klogd + syslogd 时, 内核消息被追加到/var/log/messages。
- 当系统没有klogd时,需要读/proc/kmsg(或用命令dmesg)来获取消息。
- 通过/proc/sys/kernel/printk 读写控制台记录级别。 分别为:当前记录级别/没有明确记录级别的缺省级别/允许的最小记录级别/启动时缺省记录级别。 要把所有内核消息出现在控制台,通过命令 #echo 8 > /proc/sys/kernel/printk