18---调试

内核代码调试前,需要哪些准备工作?

  • 一个确定的bug,该bug可以重现
  • 该bug最早出现的内核版本
  • 相关内核代码知识

bug存在的外在表现有哪些?

  • 明白无误的错误代码,如没有把正确的值放在合适的位置
  • 同步时发生错误,如共享变量锁定不当
  • 错误地管理硬件,如给错误的控制寄存器发送错误的指令
  • 降低所有程序的运行性能
  • 毁坏数据
  • 使系统处于死锁状态

在哪些地方可以使用printk()打印函数来调试代码?

  • 中断上下文
  • 进程上下文
  • 持有锁时
  • 在多处理器上同时被调用,而且不必持有锁

printk()和printf()有什么区别?

printk()可以指定一个日志级别,内核根据这个级别来判断是否在终端上打印消息,具体方法是:如果日志级别比终端记录等级console_loglevel低,消息就会显示在终端上。

printk()有哪些日志级别,各是什么含义?

  • kern_emerg<0>--------一个紧急情况
  • kern_alert<1>----------一个需要立即被注意到的错误
  • kern_crit<2>------------一个临界情况
  • kern_err<3>------------一个错误
  • kern_warning<4>-----一个警告
  • kern_notice<5>--------一个普通的,不过也有可能需要注意的情况
  • kern_info<6>-----------一条非正式的消息
  • kern_debug<7>--------一条调试信息,一般是冗余消息

什么是记录缓冲区?

printk()产生的消息被保存在一个环形队列缓冲区,该缓冲区大小可以设置。当环形队列消息已满,printk()产生的新消息就会覆盖旧的消息,造成消息丢失。

用户如何获取记录缓冲区的消息?

用户空间的守护进程klogd从记录缓冲区中获取内核消息,再通过syslogd守护进程将它们保存在系统日志文件。

oops有什么作用?

内核向用户报告错误,包括向终端输出错误信息、输出寄存器中保存信息和可供跟踪的回溯线索。

如何知道bug是什么时候引入内核版本的?

采用二分法,先找到一个确定存在bug的内核版本,然后找到以往一个正常的内核版本。最后在问题内核和良好内核之间采用二分法找到bug第一次出现的内核。

猜你喜欢

转载自blog.csdn.net/weixin_42415578/article/details/84582715
18