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. 投稿核心期刊、中文重要期刊、SCI二区及以上期刊目录

    大家在研究生期间想必均经历过投稿核心期刊的烦恼,不知道哪些是核心期刊,那些是普通期刊,万一选的不对岂不是浪费了时间,因此小顾在网络上收集了了2018北大核心期刊目录及全国中文重要期刊目录和SCI二区及 ...

  2. NOIP模拟赛-2018.11.5

    NOIP模拟赛 好像最近每天都会有模拟赛了.今天从高二逃考试跑到高一机房,然而高一也要考试,这回好像没有拒绝的理由了. 今天的模拟赛好像很有技术含量的感觉. T1:xgy断句. 好诡异的题目,首先给出 ...

  3. 【转】DHCP工作过程详解

    DHCP动态主机配置协议的作用我想作为网管的兄弟们都应该知道了,这里我就不多废话了,今天我要谈的是DHCP的工作过程,了解了工作过程,要排除故障就容易了.   一.DHCP客户机初始化: 1. 寻找D ...

  4. Rsyslog配置文件详解(转)

    最近在搭建日志审计服务器,使用了rsyslog,发现这篇文章很有用,收藏一下. 原文链接:http://my.oschina.net/0757/blog/198329 具体内容: 非常详细的rsysl ...

  5. CSS属性书写顺序及命名规则

    /* mozilla.org Base Styles * maintained by fantasai */ /* Suggested order: * display * list-style * ...

  6. redis集群遇到的坑

    [root@insure src]# ./redis-cli -c -h 172.16.*.* -p 6370 输入密码: auth 密码 查看节点信息 172.16.*.*:6370> clu ...

  7. statefulSet + headless service 学习记录 service :selector --> template :label

    1.statefulset.yaml apiVersion: apps/v1kind: StatefulSetmetadata:   name: webspec:    serviceName: &q ...

  8. 关于PCB的线宽与过孔

    关于PCB的线宽与过孔 我们在画PCB时一般都有一个常识,即走大电流的地方用粗线(比如50mil,甚至以上),小电流的信号可以用细线(比如10mil). 对于某些机电控制系统来说,有时候走线里流过的瞬 ...

  9. Advanced Electronic Engineer

    Job Title Advanced Electronic Engineer Job Description In this role, you have the opportunity to Be ...

  10. 【H5】dropload (移动端下拉刷新,上拉加载)

    插件概要地址:http://ximan.github.io/dropload/ 一般下载其中的demo2对照修改即可使用. 小吐槽.我在项目中用的时候,有个后端说ajax麻烦但是还是要做体现他很热爱工 ...