18.1 准备开始

需要:

1.一个确定的bug。但是,大部分bug通常都不是行为可靠定义明确的。

2.一个藏匿bug的内核版本。

18.2 内核中的bug

bug发作时的症状:

  • 明白无误的错误代码(没有把正确的值存放在恰当的位置);
  • 同步时发生的错误(共享变量锁定不当);
  • 错误地管理硬件(给错误的控制寄存器发送错误的指令)。
  • … …

18.3 通过打印来调试

18.3.1健壮性

Printk()函数最容易让人们接受的一个特质。任何时候任何地方都能调用它。

  • 可以在中断上下文和进程上下中被调用;
  • 可以在任何持有锁时被调用;
  • 可以在多处理器上同时被调用,而且调用不需要使用锁。

Early_printk()

在启动过程的初期就具有在终端上打印的能力。

18.3.2日志等级

printk()和printf()区别:

printk()可以指定一个日志级别,内核根据这个级别来判断是否在终端上打印消息。内核把级别比某个特定值低的所有消息显示在终端上。

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

18.3.3 记录缓冲区

内核消息都被保存在一个LOG_BUF_LEN大小的环形队列中。

大小可以在编译时通过设置CONFIG_LOG_BUF_SHIFT进行调整。在单处理器的系统上其默认值是16KB。(内核在同一时间只能保存16KB的内核消息)

环形缓冲区的唯一缺点:可能会丢失消息。

18.3.4 syslogd和klogd

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

默认情况下,klogd选择读取/proc方式实现系统调用。

在启动klogd时,可以通过指定-c标志来改变终端的记录等级。

18.4 oops

内核告知用户有不幸发生的最常用方式。

oops在idle进程或init进程时发生,系统陷入混乱;

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

oops中包含的重要信息对于所有体系结构都是完全相同的:寄存器上下文和回溯线索。

18.4.1 ksymoops

调用ksymoops

Ksmoops saved_oops.txt

18.4.2 kallsyms

通过定义CONFIG_KALLSYMS配置选项启用。

配置选项CONFIG_KALLSYMS_ALL表示:不仅存放函数名称,还存放所有的符号名称。

18.5 内核调试配置选项

在内和配置编辑器的内核开发菜单项中,依赖于CONFIG_DEBUG_KERNEL。

一些可以利用的选项

18.6 引发bug并打印信息

BUG()和BUG_ON()被调用时,会引发oops,导致栈的回溯和错误信息的打印。

断言:

18.7 系统请求键

通过定义CONFIG_MAGIC_SYSRQ配置选项来启用。

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

sysctl标记特性的开或关:

18.8 内核调试器的传奇

18.8.1 gdb

使用标准的GNU调试器对正在运行的内核进行查看。

针对内核启动调试器的方法与针对进程的方法大致相同:

gdb vmlinux /proc/kcore

gdb局限性:

  • 不能修改内核数据
  • 不能单步执行内核代码
  • 不能加断点

18.8.2 kgdb

补丁。在远端主机上通过串口利用gdb的所有功能对内核进行调试。

需要两台计算机:

运行带有kgdb补丁的内核;

通过串行线使用gdb对第一台进行调试。

18.9 探测系统

18.9.1 用UID作为选择条件

创建一个UID为7777的用户,专门来测试新算法。

18.9.2 使用条件变量

创建一个全局变量作为一个条件选择开关。

18.9.3 使用统计量

掌握某个特定事件的发生规律。比较多个事件并从中得出规律。通过创建统计量并提供某种机制访问其统计结果。

18.10 用二分法查找出引发罪恶的变更

1.一个可靠的可复制的错误,最好是系统一启动就能查证的bug。

2.一个能确保没问题的内核。

3.一个有问题的内核。应该从已知最早出现该问题的内核开始。

4.在问题内核和良好内核之间使用二分法了。

18.11 使用Git进行二分搜索

【读书笔记】Linux内核设计与实现(第十八章)的更多相关文章

  1. Linux内核设计与实现 第十八章

    1. 内核调试的难点 重现bug困难 调试风险比较大 定位bug的初始版本困难 2. 内核调试的工具和方法 2.1 输出 LOG 输出LOG不光是内核调试, 即使是在用户态程序的调试中, 也是经常使用 ...

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

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

  3. 2013337朱荟潼 Linux第一章读书笔记——Linux内核简介

    一.Unix历史 二.Linux足迹 类Linux系统.非商业化产品.用途广泛 三.操作系统和Linux内核简介 1.操作系统 (1)是指在整个最基本功能系统中负责完成最基本功能和系统管理的部分. ( ...

  4. 《Linux内核设计与实现》读书笔记 - 目录 (完结)

    读完这本书回过头才发现, 第一篇笔记居然是 2012年8月发的, 将近一年半的时间才看完这本书(汗!!!). 为了方便以后查看, 做个<Linux内核设计与实现>读书笔记 的目录: < ...

  5. 《Linux内核设计与实现》读书笔记(十七)- 设备与模块

    本章主要讨论与linux的设备驱动和设备管理的相关的4个内核成分,设备类型,模块,内核对象,sysfs. 主要内容: 设备类型 内核模块 内核对象 sysfs 总结 1. 设备类型 linux中主要由 ...

  6. 《Linux内核设计与实现》读书笔记(十九)- 可移植性

    linux内核的移植性非常好, 目前的内核也支持非常多的体系结构(有20多个). 但是刚开始时, linux也只支持 intel i386 架构, 从 v1.2版开始支持 Digital Alpha, ...

  7. 《Linux内核设计与实现》 Chapter4 读书笔记

    <Linux内核设计与实现> Chapter4 读书笔记 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子 ...

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

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

  9. 《Linux内核设计与实现》读书笔记 - 目录 (完结)【转】

    转自:http://www.cnblogs.com/wang_yb/p/3514730.html 读完这本书回过头才发现, 第一篇笔记居然是 2012年8月发的, 将近一年半的时间才看完这本书(汗!! ...

  10. 《Linux内核设计与实现》读书笔记(十二)- 内存管理【转】

    转自:http://www.cnblogs.com/wang_yb/archive/2013/05/23/3095907.html 内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己 ...

随机推荐

  1. 以太坊预言机与WEB API(原创,转载请说明原址)

    什么是预言机? 从链外获得数据,提供区块链与现实世界事件之间的连接,提供外部信息的平台 预言机自身也是一种智能合约,它允许区块链连接到任何现有的API 是这个预言机去调用各种 WEB API的接口 这 ...

  2. 原生js返回顶部(匀速、由快到慢)

    在项目中我们经常有需求要求页面滚动到一定位置时出现返回顶部按钮,点击即返回顶部. 方法一: 锚点,这是最简单的.(a标签的href属性等于一直要到达位置元素的id值) 方法二: js直接给页面根节点设 ...

  3. vue2.0学习笔记之组件

    [易错点]:  1.   组件内html代码片段超过一个标签时必须套一个根元素,即template模板子元素只能是一个. 2.   组件名称采用横杠间隔命名时,第一个字母大写会报错.   写法一:全局 ...

  4. 2-6 R语言基础 缺失值

    #缺失值 Missing Value > #NaN不可识别NA> x <- c(1,NA,2,NA,3) > is.na(x)[1] FALSE TRUE FALSE TRUE ...

  5. 基于汇编的 C/C++ 协程 - 背景知识

    近几年来,协程在 C/C++ 服务器中的解决方案开始涌现.本文主要阐述以汇编实现上下文切换的协程方案,并且说明其在异步开发模式中的应用. 本文地址:https://segmentfault.com/a ...

  6. Linux命令——压缩和解压缩

    Linux命令--压缩和解压缩 尽管文件后缀名在Linux中没什么用,但还是来看看: .gz:表示由gzip压缩工具压缩的文件 .bz2:表示由bzip2压缩工具压缩的文件 .tar:表示由tar打包 ...

  7. aips初步设想

    2018年5月10日星期四 目标:设计一个高并发,高性能,可扩展的现代化综合大前置机. 具备以下功能: 协议支持:http.socket.mq 报文支持:xml.json.8583 Tps:500笔/ ...

  8. Regionserver启动后又关闭

    今天启动hbase shell,输入hbase命令时报错: ERROR [regionserver/regionserver1/172.18.0.61:16020] reggionserver.HRe ...

  9. Ruby知识总结-一般变量+操作符+if+数组和哈希

    ruby入门掌握其实很简单,下面对我司主要使用的部分入门做一个简单的归纳总结: 本文的文章结构: 1.变量 2.操作符 3.if~else~end .unless 4.数组(Array) 5.哈希(H ...

  10. 2017-2018-2 『网络对抗技术』Exp2:后门原理与实践

    1. 后门原理与实践实验说明及预备知识 一.实验说明 任务一:使用netcat获取主机操作Shell,cron启动 (0.5分) 任务二:使用socat获取主机操作Shell, 任务计划启动 (0.5 ...