【读书笔记】Linux内核设计与实现(第十八章)
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内核设计与实现(第十八章)的更多相关文章
- Linux内核设计与实现 第十八章
1. 内核调试的难点 重现bug困难 调试风险比较大 定位bug的初始版本困难 2. 内核调试的工具和方法 2.1 输出 LOG 输出LOG不光是内核调试, 即使是在用户态程序的调试中, 也是经常使用 ...
- Linux内核设计与实现第十周读书笔记
第十七章 设备与模块 关于设备驱动与设备管理,我们讨论四种内核成分. 设备类型 模块 内核对象 sysfs 17.1设备类型 在Linux以及所有Unix系统中,设备被分为以下三种类型: 块设备,块设 ...
- 2013337朱荟潼 Linux第一章读书笔记——Linux内核简介
一.Unix历史 二.Linux足迹 类Linux系统.非商业化产品.用途广泛 三.操作系统和Linux内核简介 1.操作系统 (1)是指在整个最基本功能系统中负责完成最基本功能和系统管理的部分. ( ...
- 《Linux内核设计与实现》读书笔记 - 目录 (完结)
读完这本书回过头才发现, 第一篇笔记居然是 2012年8月发的, 将近一年半的时间才看完这本书(汗!!!). 为了方便以后查看, 做个<Linux内核设计与实现>读书笔记 的目录: < ...
- 《Linux内核设计与实现》读书笔记(十七)- 设备与模块
本章主要讨论与linux的设备驱动和设备管理的相关的4个内核成分,设备类型,模块,内核对象,sysfs. 主要内容: 设备类型 内核模块 内核对象 sysfs 总结 1. 设备类型 linux中主要由 ...
- 《Linux内核设计与实现》读书笔记(十九)- 可移植性
linux内核的移植性非常好, 目前的内核也支持非常多的体系结构(有20多个). 但是刚开始时, linux也只支持 intel i386 架构, 从 v1.2版开始支持 Digital Alpha, ...
- 《Linux内核设计与实现》 Chapter4 读书笔记
<Linux内核设计与实现> Chapter4 读书笔记 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子 ...
- 《Linux内核设计与实现》Chapter 3 读书笔记
<Linux内核设计与实现>Chapter 3 读书笔记 进程管理是所有操作系统的心脏所在. 一.进程 1.进程就是处于执行期的程序以及它所包含的资源的总称. 2.线程是在进程中活动的对象 ...
- 《Linux内核设计与实现》读书笔记 - 目录 (完结)【转】
转自:http://www.cnblogs.com/wang_yb/p/3514730.html 读完这本书回过头才发现, 第一篇笔记居然是 2012年8月发的, 将近一年半的时间才看完这本书(汗!! ...
- 《Linux内核设计与实现》读书笔记(十二)- 内存管理【转】
转自:http://www.cnblogs.com/wang_yb/archive/2013/05/23/3095907.html 内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己 ...
随机推荐
- SVN 图标不显示的解决办法
SVN 的图标没办法显示了.经搜索,发现需要修改注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Sh ...
- H5页面meta标签小结:
<meta name="viewport" content="width=device-width,user-scalable=no"> <m ...
- 2-4 R语言基础 列表
#列表list > l1 <- list("a",2,10L,3+4i,TRUE) #每个元素没有名字> l1[[1]][1] "a" [[2 ...
- 面向对象的JavaScript --- 动态类型语言
面向对象的JavaScript --- 动态类型语言 动态类型语言与面向接口编程 JavaScript 没有提供传统面向对象语言中的类式继承,而是通过原型委托的方式来实现对象与对象之间的继承. Jav ...
- import org.apache.http.xxxxxx 爆红,包不存在之解决办法
问题如下:import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http ...
- Docker技术入门与实战 第二版-学习笔记-8-网络功能network-3-容器访问控制和自定义网桥
1)容器访问控制 容器的访问控制,主要通过 Linux 上的 iptables防火墙来进行管理和实现. iptables是 Linux 上默认的防火墙软件,在大部分发行版中都自带. 容器访问外部网络 ...
- ethereumjs/ethereumjs-tx
https://github.com/ethereumjs/ethereumjs-tx A simple module for creating, manipulating and signing e ...
- webservice 客户端调用
/** * 通过webserevice下发工单 * @param url * @param method * @param requestMap * @return * @throws Service ...
- 使用级联分类器实现人脸检测(OpenCV自带的数据)
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...
- leetcode338—Counting Bits
Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the ...