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. Python3编写网络爬虫01-基本请求库urllib的使用

    安装python后 自带urllib库 模块篇 分为几个模块如下: 1. urllib.request 请求模块 2. urllib.parse 分析模块 3. urllib.error 异常处理模块 ...

  2. Oracle_spatial的函数介绍

    Oracle_spatial的函数 一sdo_Geom包的函数: 用于表示两个几何对象的关系(结果为True/False)的函数:RELATE,WITHIN_DISTANCE 验证的函数:VALIDA ...

  3. WCF错误:413 Request Entity Too Large 的一个解决方法

    在我们用WCF传输数据的时候,如果启用默认配置,传输的数据量过大,经常会出这个WCF:413 Request Entity Too Large的错误. WCF包含服务端与客户端,所以这个错误可能出现在 ...

  4. Vue购物车

    index.html <!DOCTYPE html><html>    <head>        <meta charset="utf-8&quo ...

  5. 20155339 Exp4 恶意代码分析

    20155339 Exp4 恶意代码分析 实验后回答问题 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用什么方法来监控 ...

  6. 备忘:BLOCK CORRUPTION IN SYSTEM DATAFILE

    http://www.onlinedbasupport.com/2010/12/10/block-corruption-in-system-datafile/

  7. GBDT源码剖析

    如今,GBDT被广泛运用于互联网行业,他的原理与优点这里就不细说了,网上google一大把.但是,我自认为自己不是一个理论牛人,对GBDT的理论理解之后也做不到从理论举一反三得到更深入的结果.但是学习 ...

  8. 汇编 if else

    知识点: if else 逆向还原代码 一.了解if else结构 sub esp, |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-] 0040102C |. 3B45 ...

  9. cocos2d-x学习记录1——图片显示

    这篇算是cocos2d-x入门篇,显示一张图片即可. 观察工程中HelloWorld的结构,包含AppDelegate和HelloWorldScene两个类文件,AppDelegate中包含基本的处理 ...

  10. ElasticSearch入门 第九篇:实现正则表达式查询的思路

    这是ElasticSearch 2.4 版本系列的第九篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...