第十八章、调试

18.1 准备开始

如果bug能重现的话,将会有很大的帮助。

18.2 内核中的bug

Bug多种多样,产生的原因可以有无数的原因,表象也变化多端。

从隐藏在源代码中的错误到展现在目击者面前的bug,往往是经历一系列连锁反应的事件才可能触发的。

18.3 通过打印来调试

内核提供的打印函数是printk()

(1)健壮性:

健壮性是printk()函数最容易让人接受的一个特质。任何时候,任何地方都能调用它,所以很有用。

漏洞:在系统启动过程中,终端还没有初始化之前,在某些地方不能使用它。

解决方法:early_printk()

(2)日志等级:

Printk()可以指定一个日志级别而printf()不能。内核可以通过这个日志级别来判断是否在终端上打印消息。内核把级别比某个特定值低的所有消息显示在终端上。

(3)记录缓冲区:

内核消息都被保存在一个LOG_BUF_LEN大小的环形队列中。这个记录缓冲区之所以称为环形,是因为它的读写都是按照环形队列方式进行操作的。

(4)Syslogd和klogd

在标准的Linux系统上,用户空间的守护进程klogd从记录缓冲区中获取内核消息,再通过syslogd守护进程将它们保存在系统日志文件中。

(5)从printf()到printk()的转换

二者不要搞混了

18.4 oops:

Oops是内核告知用户有不幸发生的最常用方式。由于内核是整个系统的管理者,所以它不能采取像在用户空间出现运行错误时使用的那些简单手段,

因为它很难自行修复,它也不能将自己杀死。

内核只能发布oops。这个过程包括向终端上输出错误消息,输出寄存器中保存的信息并输出可供跟踪的回溯信息。

Oops的产生原因可能有很多,其中包括内存访问越界或者非法的指令等。

Oops中包含的重要信息对于所有体系结构都是完全相同的:寄存器上下文和回溯线索。

(1)ksymoops:

回溯线索中的地址需要转化成有意义的符号名称才方便使用。这需要调用ksymoops命令,并且还必须提供编译内核时产生的System.map。如果

使用的是模块,还需要一些模块信息。Ksymoops通常会自行解析这些信息,所以一般可以这样调用它:

Ksymoops saved_oops.txt

然后该程序就会吐出解码板的oops。

18.5 kallsyms:

可以通过定义CONFIG_KALLSYMS配置选项启用。

编译时为了调试和测试内核代码。

18.6 引发bug并打印信息:

BUG()和BUG_ON()

If(bad thing)

BUG();

或:

BUG_ON(bad_thing);

18.7 神奇系统请求键

该功能通过定义CONFIG_MAGIC_SYSRQ配置选项来启动。

通过sysctl用来标记该特性的开或关。

18.8 内核调试器的传奇

(1)gdb:

Gdb vmlinux /proc/kcroe

如果编译内核的时候使用了-g参数,gdb还可以提供更多的信息。

(2)kgdb:

Kgdb是一个补丁,它可以让我们在远端主机上通过串口利用gdb的所有功能对内核进行调试。这需要两台计算机:第一台运行带有kgdb

补丁的内核,第二台通过串行线使用gdb对第一台进行调试。

18.9 探测系统

(1)用UID作为选择条件

(2)使用条件变量

(3)使用统计量

(4)重复频率限制

18.10 用二分查找法找出引发罪恶的变更

18.11 使用Git进行二分搜索

18.12 社区

《Linux内核设计与实现》第18章读书整理的更多相关文章

  1. 《Linux内核设计与实现》第四周读书笔记——第五章

    <Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...

  2. linux及安全《Linux内核设计与实现》第一章——20135227黄晓妍

    <linux内核设计与实现>第一章 第一章Linux内核简介: 1.3操作系统和内核简介 操作系统:系统包含了操作系统和所有运行在它之上的应用程序.操作系统是指整个在系统中负责完成最基本功 ...

  3. LINUX内核设计与实现第三周读书笔记

    LINUX内核设计与实现第三周读书笔记 第一章 LINUX内核简介 1.1 Unix的历史 1969年的夏天,贝尔实验室的程序员们在一台PDR-7型机上实现了Unix这个全新的操作系统. 1973年, ...

  4. 《Linux内核设计与实现》Chapter 3 读书笔记

    <Linux内核设计与实现>Chapter 3 读书笔记 进程管理是所有操作系统的心脏所在. 一.进程 1.进程就是处于执行期的程序以及它所包含的资源的总称. 2.线程是在进程中活动的对象 ...

  5. 《Linux内核设计与实现》Chapter 1 读书笔记

    <Linux内核设计与实现>Chapter 1 读书笔记 一.Unix的特点 Unix从Multics中产生,是一个强大.健壮和稳定的操作系统. 特点 1.很简洁 2.在Unix系统中,所 ...

  6. 《Linux内核设计与实现》Chapter 2 读书笔记

    <Linux内核设计与实现>Chapter 2 读书笔记 一.获取内核源码 1.使用Git 我们曾经在以前的学习中使用过Git方法 $ git clone git://git.kernel ...

  7. 《Linux内核设计与实现》Chapter 5 读书笔记

    <Linux内核设计与实现>Chapter 5 读书笔记 在现代操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口的作用是: 使应用程序受限地访问硬件设备 提供创建新进程与已 ...

  8. 《linux内核设计与实现》第一章

    第一章Linux内核简介 一.unix 1.Unix的历史 Unix是现存操作系统中最强大和最优秀的系统. ——1969年由Ken Thompson和Dernis Ritchie的灵感点亮的产物. — ...

  9. Linux内核设计与实现 第十七章

    1. 设备类型 linux中主要由3种类型的设备,分别是: 设备类型 代表设备 特点 访问方式 块设备 硬盘,光盘 随机访问设备中的内容 一般都是把设备挂载为文件系统后再访问 字符设备 键盘,打印机 ...

  10. linux及安全《Linux内核设计与实现》第二章——20135227黄晓妍

    第二章:从内核出发 2.1获取源代码 2.1.1使用git Git:内核开发者们用来管理Linux内核源代码的控制系统. 我们使用git来下载和管理Linux源代码. 2.1.2安装内核源代码(如果使 ...

随机推荐

  1. 团队作业——Beta冲刺4

    团队作业--Beta冲刺 冲刺任务安排 杨光海天 今日任务:在同队成员帮助下,完成了浏览详情界面的跳转,以及图片的嵌入 明日任务:继续完成浏览详情界面 吴松青 今日任务:研究图片详情界面后端函数,遇到 ...

  2. Git提交分支

    Git提交分支操作 1.git add 命令告诉 Git 开始对这些文件进行跟踪 git add . 2.然后提交 git commit -m'这是注释信息' 3.git pull命令用于从另一个存储 ...

  3. Python返回数组(List)长度的方法

    其实很简单,用len函数: >>> array = [0,1,2,3,4,5]>>> print len(array) 同样,要获取一字符串的长度,也是用这个len ...

  4. 【Lucene4.8教程之六】QueryParser与Query子类:怎样生成Query对象

    版权声明:本文为博主原创文章.转载请注明来自http://blog.csdn.net/jediael_lu/ https://blog.csdn.net/jediael_lu/article/deta ...

  5. Java 回调函数例子

    首先定义一个类Caller,按照上面的定义就是程序员A写的程序a,这个类里面保存一个接口引用. public class Caller { private MyCallInterface callIn ...

  6. [题目] Luogu P3716 [CTSC2000]冰原探险

    题面 题目背景 传说中,南极有一片广阔的冰原,在冰原下藏有史前文明的遗址.整个冰原被横竖划分成了很多个大小相等的方格.在这个冰原上有N个大小不等的矩形冰山,这些巨大的冰山有着和南极一样古老的历史,每个 ...

  7. apache出现You don’t have permission to access / on this server问题的解决

    今天在部署一个系统时,在apache中新开了一个VirtualHost,然后设置了DocumentRoot,等访问时却提示“You don’t have permission to access / ...

  8. 关于 Spring AOP (AspectJ) 该知晓的一切

    关联文章: 关于Spring IOC (DI-依赖注入)你需要知道的一切 关于 Spring AOP (AspectJ) 你该知晓的一切 本篇是年后第一篇博文,由于博主用了不少时间在构思这篇博文,加上 ...

  9. Kubernetes1.91(K8s)安装部署过程(六)--node节点部署

    hi,everybody,我回来了,之前安装到flannel之后,文章一直没有更新,甚至不少小伙伴都来加qq询问是否继续更新了, 这里说明下原因,我在部署1.91node的时候的确出现了各种各样的问题 ...

  10. 三,ESP8266 SPI(基于Lua脚本语言)

    https://www.cnblogs.com/yangfengwu/p/7520260.html 重点是说SPI通信协议,,,, 不要害怕协议因为协议是人规定的,,刚好我也是人......规定的协议 ...