一、想要成功进行调试:linux
2、内核中的buggit
从隐藏在源代码中的错误到展示在目睹者面前的bug,每每是经历一系列连锁反应的事件才可能触发的。内核确实有一些独特的问题须要考虑,像定时限制和竞争条件等,它们都是容许多个线程在内核中同时运行产生的结果。ide
3、经过打印来调试
内核提供的打印函数printk()和C 库提供的printf()函数功能几乎相同。函数
一、健壮性oop
二、日志等级spa
三、记录缓冲区线程
四、syslogd 和klogd调试
4、oops日志
一、ksymoops
若是使用的是模块, 还须要一些模块信息。ksymoops 一般会自行解析这些信息,调用后获得解码板的oops队列
ksymoops saved_ oops. txt
二、kallsyms
5、内核调试配置选项
内核开发( Kernel hacking)菜单项中,它们都依赖于CONFIG_DEBUG_KERNEL。。其中最有用的一个是sleep-inside-spinlock-checking (自旋锁内睡眠选项)。使用锁时睡眠是引起死锁的元凶。因此,包括正使用锁的时候调用,正使用锁的时候以阻塞方式请求分配内存和在引用单CPU 数据时睡眼在内,各类潜在的bug 都可以被探测到。
6、引起bug 并打印信息
最经常使用的两个是BUG() 和BUG_ON()。当披调用的时候,它们会引起oops ,致使栓的回溯和错误信息的打印能够把这些调用当作断言使用,想要断言某种状况不应发生:
if (bad_thing)
BUG();
或者使用更好的形式:
BUG_ON (bad_thing);
多数内核开发者相信BUG_ON()比BUG()更清晰、更可读, 并且BUG_ON()会将其声明做为一个语句放入unlikely()中。
能够用panic()引起更严重的错误。调用panic()不但会打印错误消息,并且还会挂起整个系统。显然,只应该在最糟糕的状况下使用它
if (terrible_thing)
panic ( ” terrible thing is %ld\n ”, terrible_thing);
7、内核调试器的传奇
一、gdb
gdb vml inux /proc/kcore
【其中vmlinux 文件是未经压缩的内核映像,不是压缩过的zlmage 或bzlmage,它存放在源代码树的根目录上。】
二、kgdb
一开始,你得告诉Git 你要进行二分搜索:
$ git bisect start
而后再为Git 提供一个出现问题的最先内核版本:
$ git bisect bad <revision>
若是当前的内核版本就是引起bug的罪魁祸首,那么就没必要提供内核版本:
$ git bisect bad
而后,还得为Git 提供一个最新的可正常运行的内核版本:
$ git bisect good v2.6.28
若是这个版本一切正常,能够运行下面的命令:
$ git bisect good
若是这个版本运行有异常一一也就是说,若是证实这个给定的内核版本有bug,能够运行:
$ git bisect bad
若是你已经知道引起bug 的源(好比, x86 机型的启动代码),你能够指定git仅仅在与错模相关的目录列表中去二分搜索提交的补丁。
$ git bisect start - arch/x86