第十八章 调试


一、调试开始前的准备

1.准备开始

  • bug
  • 藏匿bug的版本
  • 相关内核代码的知识

  成功调试的关键在于能否将错误重现

2.内核中的bug

  其产生原因无数,表象变化也多种多样。从隐藏在源代码中的错误到出现的bug,可能是由一系列连锁反应触发的。

二、通过打印调试

1.健壮性

  printk()函数的健壮性特质使得任何时候、任何地方都能调用它。

  • 在中断上下文和进程上下中使用
  • 在任何持有锁被调用时
  • 在多处理器上同时被调用

2.日志等级

  printk()和printf()在使用上的最主要区别是前者可以指定一个日志级别,内核根据这个级别判断终端是否打印消息;

  KERN_WARNING和KERN_DEBUG都是<linux/kernel.h>中的简单宏定义,扩展开是<4>和<7>这样的字符串,加进printk()函数要打印的开头。

  内核将最重要的记录等级定为<0>,最无关紧要的记录等级定为<7>。

3.记录缓冲区

  • 记录消息被保存在一个环形队列中,读写按照环形队列方式进行操作
  • 内核在同一时间只能保存16KB的消息,当消息队列达到最大值,再有调用时,新消息将覆盖队列中的老消息。
  • 优点:同步问题很容易解决;记录维护也变得容易。
  • 缺点:可能会丢失消息

4.syslogd和klogd

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

三、oops

1.发布oops的过程

  包括向终端上输出错误消息,输出寄存器中保存的信息并输出可供跟踪的回溯线索。通常,发送完内核会处于不稳定状态。

2.导致结果

  如果发生在中断上下文时,内核会陷入混乱,系统死机;

  如果在idle或init进程时发生,系统同样会陷入混乱,缺失这两个进程,内核无法工作。

  如果在其他进程运行时发生,内核会杀死该进程并尝试继续执行。

3.发生原因

  内存访问越界或非法指令

4.包含的信息结构

  寄存器上下文和回溯线索

  • 回溯线索显示导致错误发生的函数调用链
  • 寄存器数据可以帮助重建引发问题现场

四、引发bug并打印信息

  BUG()和BUG_ON()是常用的标记bug的内核调用,被调用时,会引发oops,导致栈的回溯和错误信息的打印。

  用panic()引发更严重的错误,不但打印错误信息,还会挂起整个系统。

五、Magic SysRq Key

  当该功能被启用时,无论内核处于什么状态,都可通过特殊的组合键跟内核进行通信。

  • 使用定义CONFIG_MAGIC_SYSRQ配置选项和命令echo 1 > /proc/sys/kernel/sysyrq启用

六、内核调试器和系统探测

1.内核调试器

  • 可以使用标准的GNU内核调试器对正在运行的内核进行查看
  • 可以使用gdb的所有命令来获取信息

2.探测系统

  • 用UID作为选择条件,可以安排到底执行哪种算法
  • 使用条件变量,创建一个全局变量作为一个条件选择开关
  • 使用统计量,通过创建统计量提供某种机制访问其统计结果
  • 重复频率限制,用于某种事件发生频繁,又要观察它的整体情况。为避免信息发生井喷,可以每隔几秒执行一次打印。

七、二分查找法与GIT工具

1.当不知道哪个内核版本引入bug,但又确实存在使用二分法进行查找

  假定一个版本有问题,而另一个没有,从二者正中选择版本检查,从而缩小范围,以此类推。

2.使用GIT进行二分搜索

  如果使用GIT来控制Linux源码树的副本,那么它将自动进行二分搜索进程

  • 告诉GIT进行二分搜索

  $ git bisect start

  • 为GIT提供一个出现问题的最早内核版本

  $ git bisect bad <revision>

  • 提供一个最新的可正常运行的内核版本

  $ git bisect good 版本号

  这样,GIT将自动检测正常版本和有bug的版本哪个之间有隐患,接着再编译运行以及测试正被检测版本。

 

  

  

《Linux内核设计与实现》第18章读书笔记的更多相关文章

  1. 《Linux内核设计与实现》第四周读书笔记——第五章

    <Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...

  2. LINUX内核设计与实现第三周读书笔记

    LINUX内核设计与实现第三周读书笔记 第一章 LINUX内核简介 1.1 Unix的历史 1969年的夏天,贝尔实验室的程序员们在一台PDR-7型机上实现了Unix这个全新的操作系统. 1973年, ...

  3. 《Linux内核设计与实现》Chapter 3 读书笔记

    <Linux内核设计与实现>Chapter 3 读书笔记 进程管理是所有操作系统的心脏所在. 一.进程 1.进程就是处于执行期的程序以及它所包含的资源的总称. 2.线程是在进程中活动的对象 ...

  4. 《Linux内核设计与实现》Chapter 1 读书笔记

    <Linux内核设计与实现>Chapter 1 读书笔记 一.Unix的特点 Unix从Multics中产生,是一个强大.健壮和稳定的操作系统. 特点 1.很简洁 2.在Unix系统中,所 ...

  5. 《Linux内核设计与实现》Chapter 2 读书笔记

    <Linux内核设计与实现>Chapter 2 读书笔记 一.获取内核源码 1.使用Git 我们曾经在以前的学习中使用过Git方法 $ git clone git://git.kernel ...

  6. 《Linux内核设计与实现》Chapter 5 读书笔记

    <Linux内核设计与实现>Chapter 5 读书笔记 在现代操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口的作用是: 使应用程序受限地访问硬件设备 提供创建新进程与已 ...

  7. Linux内核设计与实现第十周读书笔记

    第十七章 设备与模块 关于设备驱动与设备管理,我们讨论四种内核成分. 设备类型 模块 内核对象 sysfs 17.1设备类型 在Linux以及所有Unix系统中,设备被分为以下三种类型: 块设备,块设 ...

  8. Linux内核设计与实现第五周读书笔记

    第十八章 调试 18.1准备开始 需要的只是: 一个确定的bug.大部分bug通常都不是行为可靠而且定义明确的. 一个藏匿bug的内核版本. 相关的内核代码的知识和运气. 18.2内核中的bug 内核 ...

  9. Linux内核设计与实现第八周读书笔记

    第四章 进程调度 进程在操作系统看来是程序的运行态表现形式. 4.1多任务 多任务操作系统就是能同时并发地交互执行多个进程的操作系统. 多任务操作系统会使多个进程处于堵塞或者睡眠状态.这些任务尽管位于 ...

  10. Linux内核设计与实现第六周读书笔记

    第三章 进程管理 3.1 进程 进程是处于执行期的代码.通常进程还要包含其他资源,像打开的文件.挂起的信号.内核的内部数据.处理器状态.一个或多个具有内存映射的内存地址空间及一个或多个执行线程,当然还 ...

随机推荐

  1. Django 前后端不分离 代码结构详解

    Demo:  hello_pycharm 根目录文件:hello_pycharm [__init__.py  __pycache__  settings.py  urls.py  wsgi.py] A ...

  2. CUDA、CUDNN在Mac Book Pro上安装的问题

    由于原版MacOS自带Nvidia驱动版本过低,导致最新版本CUDA安装后无法运行.具体症状为:在编译时一切正常,在运行CUDA相关程序时报错: CUDA driver version is insu ...

  3. mysql 连接超时解决方案: 怎样修改默认超时时间

    mysql数据库有一个wait_timeout的配置,默认值为28800(即8小时). 在默认配置不改变的情况下,如果连续8小时内都没有访问数据库的操作,再次访问mysql数据库的时候,mysql数据 ...

  4. [译文]c#扩展方法(Extension Method In C#)

    原文链接: https://www.codeproject.com/Tips/709310/Extension-Method-In-Csharp 介绍 扩展方法是C# 3.0引入的新特性.扩展方法使你 ...

  5. django_models_Meta字段详解

    Django模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.而可用的选项大致包含以下几类 abstract 这个属性是定义当前的模型是不是一个抽象类.所谓抽象类是不会对应数据 ...

  6. LIFI热火下的VLC基本链路、标准及发展问题

    和白炽及荧光灯相比,白光发光二极管(LED)具有寿命长.光效高.功耗低.无辐射.安全性好.可靠性高等特点,被称为"绿色照明"并得到迅猛发展.白光LED在未来市场极具竞争力.世界范围 ...

  7. eclipse自动生成uml

    见如下链接: https://blog.csdn.net/zyf_balance/article/details/44937197 若eclipse无法生成,可以安装myeclipse使用自带的方法: ...

  8. 20172319 《Java程序设计教程》 第9周学习总结

    20172319 2018.05.06-05.14 <Java程序设计教程>第9周学习总结 目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考 ...

  9. hive-2.3.3安装

    1.下载hive-2.3.3 下载地址 http://archive.apache.org/dist/hive/hive-2.3.3 解压,编辑/etc/profile添加HIVE_HOME,保存文件 ...

  10. servlet几个常用的方法

    servlet继承了HTTPServlet所以可以重写父类的方法,下面一 一介绍方法Dopost DoGet 比较常用不再介绍. 一.Init(),和Init(ServletConfig config ...