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. SDN 第二次上机作业

    SDN第二次上机作业 1.控制器floodlight所示可视化图形拓扑的截图,及主机拓扑连通性检测截图 拓扑 连通性 2.利用字符界面下发流表,使得'h1'和'h2' ping 不通 流表截图 连通性 ...

  2. 团队作业8--测试与发布(Beta阶段)

    展示博客 一.项目成员: 张慧敏(组长)201421122032 苏晓薇(组员)201421031033 欧阳时康(组员)201421122050 团队仓库: https://git.coding.n ...

  3. Moleskine智能笔+专用本:写完随时传到手机

    http://www.totiot.com/61805.html Moleskine公司生产的速写本和速写板一直是涂鸦爱好者和速记员们的首选.该公司还联合Adobe. Livescribe. Ever ...

  4. ELK日志收集分析平台 (Elasticsearch+Logstash+Kibana)使用说明

    使用ELK对返回502的报警进行日志的收集汇总 eg:Server用户访问网站返回502 首先在zabbix上找到Server的IP 然后登录到elk上使用如下搜索条件: pool_select:X. ...

  5. Net dll组件版本兼容问题

    dll组件版本兼容问题,是生产开发中经常遇到的问题,常见组件兼容问题如:Newtonsoft.Json,log4net等 为了节约大家时间,想直接看解决方法的,可直接点击目录3.4 目录 1.版本兼容 ...

  6. springmvc与ajax交互常见问题

    这是我个人再编写博客系统的时候,因个人疏忽犯下的低级错误. 不过犯错是一件好事,有助于总结. 1.关于参数前加@RequestBody 如果是使用ajax交互时,必须要加上这个contentType: ...

  7. QT学习笔记8:QDir类及其用法总结

    简介 QDir类提供了访问系统目录结构及其内容的与平台无关的方式. 头文件:#include <qdir.h> QDir类用来操作路径名及底层文件系统,获取关于目录路径及文件的相关信息,也 ...

  8. JS重构分页

    JS重构分页 很早以前写过一个Jquery分页组件,但是当时写的组件有个缺点,当时的JS插件是这样设计的:比如:点击  -->  查询按钮 ---> 发ajax请求 返回总页数和所有数据, ...

  9. 【来龙去脉系列】AutoMapper一款自动映射框架

    前言 通常在一个应用程序中,我们开发人员会在两个不同的类型对象之间传输数据,通常我们会用DTOs(数据传输对象),View Models(视图模型),或者直接是一些从一个service或者Web AP ...

  10. [GitHub]GitHub for Windows离线安装的方法

    这几天一直在尝试安装GitHub for windows ,安装程序是从https://windows.github.com/ 下载到的OneClick 部署程序,版本号为2.11.0.5.可能是因为 ...