1.二分法与printk()
AB之间有个bug,在AB之间找个中间点C,使用printk,查看bug在AC还是CB。以此类推。其中printk(“__func__”)
设定printk的级别,八个级别分别是从1--8,其中1基本最高,只打印系统可能崩溃的信息。我们可以使用命令
echo 8 > /proc/kernel/printk;可以打印所有的消息。
在我们的系统pnfs中可以输入:
2.syslog && dmesg
cat /var/log/message dmesg;
3.gdb调试内核。
gdb /user/src/linux/vmlinux /proc/kore.但是不能调试可加载模块。。。。只能调试内核的模块。
4.BUG(),BUG_ON()可能会引发oops,
#define BUG() do {
printk("BUG: failure at %s:%d/%s()! ", __FILE__, __LINE__, __FUNCTION__);
panic("BUG!"); /* 引发更严重的错误,不但打印错误消息,而且整个系统业会挂起 */
} while (0)
#endif
5. 内存调试工具 MEMWATCH,
6 strace pwd.显示系统调用的trace
7.kgdb,提供了使用gdb调试内核的机制。需要两台机器,一代开发机,一台目标机,机器通过串口或以太网口相连,gdb调试器运行在开发机上。(不好用。。。)