【读书笔记】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 内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己 ...
随机推荐
- 【CSS】Sass理解
原文在 https://github.com/zhongxia245/blog , 欢迎 star! Sass理解 时间:2016-09-24 22:56:12 作者:zhongxia 这里就不讲解S ...
- 团队作业——Alpha冲刺 1/12
团队作业--Alpha冲刺 Alpha 阶段认领的任务 杨光海天:加入随心摘首页和编辑界面的开发中,并完成冲刺博文的撰写 郭剑南.周琪文:图像识别核心算法的实现 赖志平:随心摘首页和编辑界面开发主力, ...
- Rx编程的第一步是将native对象转换为monad对象
Rx编程的第一步是将native对象转换为monad对象 将基础类型转换为高阶类型,以便使用函数式编程的特性.
- BZOJ4340:[BJOI2015]隐身术(后缀数组,ST表,DFS)
Description 给定两个串A,B.请问B中有多少个非空子串和A的编辑距离不超过K? 所谓“子串”,指的是B中连续的一段.不同位置的内容相同的子串算作多个. 两个串之间的“编辑距离”指的是把一个 ...
- CentOS7.5搭建Flask环境python3.6+mysql+redis+virtualenv
wget安装环境装备 yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncur ...
- 企业案例--生产环节更改mysql字符集
查看数据库字符集: show database create dbname \G; 查看数据库表字符集: show table create tbname \G; 查看现有数据库字符集设置: show ...
- 动态代理实现设置tomcat请求编码
1)htmlcode: <html> <head> <title>$Title$</title> </head> <body> ...
- C++之内联函数
C++语言新增关键字 inline,用于将一个函数声明为内联函数.在程序编译时,编译器会将内联函数调用处用函数体替换,这一点类似于C语言中的宏扩展. 采用内联函数可以有效避免函数调用的开销,程序执行效 ...
- 在ASP.NET Core上实施每个租户策略的数据库
在ASP.NET Core上实施每个租户策略的数据库 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: http://g ...
- CM (Cloudera Manager) 的安装,便于CDH的离线部署
一.准备工作 主机个数:n台 操作系统:CentOS 6.5 安装所需软件包: CM: cloudera-manager-el6-cm5.4.3_x86_64.tar.gz CDH parcel: C ...