第十八章调试

18.1 准备开始

  一个bug:大部分bug通常都不是行为可靠而且定义明确的

  一个藏匿bug的内核版本:找出bug首先出现的版本

  相关内核代码的知识和运气

18.2内核中的bug

可以有无数种原因产生,表象也变化多端。代码中的错误往往引发一系列连锁反应,目击者才看到bug。

18.3通过打印来调试

Printk()的特质:

  健壮性:任何时候,任何地方都可以调用。仅有的不能调用的情况是在终端还没初始化之前。Early_printk()再启动过程初期就可以打印。

  日志等级:可以在打印的消息的开头加上记录等级,内核通过记录等级和当前终端的记录登记比较,来决定是否打印。最好给消息加记录等级 ,不然就是默认等级KERN_WARNING。<0>到<7>。

  记录缓冲区:内核消息保存在一个环形队列中,单处理器默认16k,环形可以新信息覆盖老信息。好处是同步问题容易解决,记录也容易维护。坏处是可能会丢失信息。

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

  Printf()到printk():等啥时候写C语言会把pringf()错写成printk()就行了。

18.4opps

  是内核告知用户有不幸发生的最常用方式。因为内核不能自我修复,也不能将自己杀死,所以只有发oops。通常发完oops,内核会处于不稳定状态。内核必须适当的从当前上下文环境退出并尝试恢复对系统的控制,但一般会死机。寄存器上下文和回溯线索。

  Ksymoops:解析opps信息。Ksymoops save_oops.txt

  Kallsyms:解码不需要再使用system.map和ksymoops工具了

18.5 内核调试配置选项

  为了方便调试和测试内核代码,内核提供了配置选项。可以启用slab layer debugging,high-memory debugging,I/O mapping debugging,spin-lock debugging,stack-overflow checking.其中最有用的是sleep-inside-spinlock check

18.6引发bug并打印信息

一些内核调用可以用来方便标记bug,BUG(),BUG_ON()

Panic()可以引发更严重的错误。dumo_stack()仅在终端上打印寄存器上下文和跟踪线索。

18.7神奇的系统请求键

Sysrq(系统请求)键是救命稻草,无论内核出于什么状态,都可以和内核进行通信。

Sysrq-h:获取一份可用选项列表

Sysrq-s:将脏缓冲区跟硬盘交换分区同步

Sysrq-u:卸载所有的文件系统

    Sysrq-b:重启设备

   ……

18.8内核调试器的传奇

gdb:gdb vmlinux /proc/kcore启动调试器。Gdb不能修改内核数据,不能设断点。

kgdb:一个补丁,让我们在远端主机上通过串口利用gdb的所有功能得内核进行调试。

18.9探测系统

用UID作为选择条件

使用条件变量

使用统计量

重复频率限制

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

知道bug是什么版中出现的,就可以对比没有bug的版本,找出引发bug的代码变更。用二分法找到两个相继版本,一个有bug,一个没bug

18.11使用Git进行二分搜索 

Git源码管理工具提供二分搜索机制     

小结:
   
本章讨论了内核的调试——调试过程其实就是实现与目标偏差的行为。

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

  1. Linux内核设计与实现 读书笔记 转

    Linux内核设计与实现  读书笔记: http://www.cnblogs.com/wang_yb/tag/linux-kernel/ <深入理解LINUX内存管理> http://bl ...

  2. Linux内核设计与实现 读书笔记

    第三章 进程管理 1. fork系统调用从内核返回两次: 一次返回到子进程,一次返回到父进程 2. task_struct结构是用slab分配器分配的,2.6以前的是放在内核栈的栈底的:所有进程的ta ...

  3. Linux内核设计与实现读书笔记(8)-内核同步方法【转】

    转自:http://blog.chinaunix.net/uid-10469829-id-2953001.html 1.原子操作可以保证指令以原子的方式执行——执行过程不被打断.内核提供了两组原子操作 ...

  4. Linux内核设计与实现——读书笔记2:进程管理

    1.进程: (1)处于执行期的程序,但不止是代码,还包括各种程序运行时所需的资源,实际上进程是正在执行的 程序的实时结果. (2)程序的本身并不是进程,进程是处于执行期的程序及其相关资源的总称. (3 ...

  5. Linux内核设计与实现——读书笔记1:内核简介

    内核:有的时候被称管理者或者操作系统核心,通常内核负责响应中断的中断服务程序, 负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间德内存管理程序 和网络,进程间通信等系统服务程序共同组 ...

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

    <Linux内核设计与实现>Chapter 18 读书笔记 一.准备开始 一个bug 一个藏匿bug的内核版本 知道这个bug最早出现在哪个内核版本中. 相关内核代码的知识和运气 想要成功 ...

  7. 初探内核之《Linux内核设计与实现》笔记上

    内核简介  本篇简单介绍内核相关的基本概念. 主要内容: 单内核和微内核 内核版本号 1. 单内核和微内核   原理 优势 劣势 单内核 整个内核都在一个大内核地址空间上运行. 1. 简单.2. 高效 ...

  8. Linux内核架构与底层--读书笔记

    linux中管道符"|"的作用 命令格式:命令A|命令B,即命令1的正确输出作为命令B的操作对象(下图应用别人的图片) 1. 例如: ps aux | grep "tes ...

  9. Linux内核设计第十七章笔记

    第十七章 设备与模块 关于设备驱动和设备管理,四种内核成分 设备类型:在所有unix系统中为了统一普通设备的操作所采用的分类 模块:Linux内核中用于按需加载和卸载目标代码的机制 内核对象:内核数据 ...

  10. Linux内核分析 一二章读书笔记

    第一章 Linux内核简介 1.Unix (1)Unix系统很简洁 (2)在Unix中,所以东西都被当作文件对待,通过一套相同的系统调用接口来进行:open(),read(),write(),lsee ...

随机推荐

  1. 使用Jenkins+gitlab自动化构建时排除分支

    我们的目的是gitlab上的代码有变动时会自动向Jenkins发送web钩子请求,触发指定的动作: 但默认情况下,所有分支(如测试环境和预生产)的代码有变动时都会触发,此时可以在Jenkins的项目设 ...

  2. 最长公共前缀的golang实现

    编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 输入: ["flower","flow",&quo ...

  3. golang的json序列化问题

    首先看一段代码: package main import ( "encoding/json" "fmt" ) type Result struct { //st ...

  4. 查询css相关属性的网站

    mozalla developer netwoke https://developer.mozilla.org/zh-CN/docs/Web/CSS/background 布局,div+css:htt ...

  5. 为什么MySQL数据库索引选择使用B+树?

    在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出B树以及为什么MySQL数据库索引选择使 ...

  6. centos7下安装docker(13.2容器数据共享)

    回想一下我们学了两种存储方式:storage driver和data volume,其中又分为bind mount和docker managed volume,我们知道storage driver就是 ...

  7. centos7下安装docker(12.3容器之间的连通性)

    我们接着盗图,如下: 在这张图上,可以看到,如果两个容器使用同一个bridge,那么两个容器之间是互相能通的 可以看到两个容器在同一个bridge下是可以互相ping通的 当两个容器在不同的bridg ...

  8. 【洛谷】【模拟+栈】P4711 「化学」相对分子质量

    [题目传送门:] [戳] (https://www.luogu.org/problemnew/show/P4711) [算法分析:] 关于一个分子拆分后的产物,一共有三种情况: 原子 原子团 水合物 ...

  9. Codeforces Round #524 (Div. 2) C. Masha and two friends 几何:判断矩形是否相交以及相交矩形坐标

    题意 :给出一个初始的黑白相间的棋盘  有两个人  第一个人先用白色染一块矩形区域 第二个人再用黑色染一块矩形区域 问最后黑白格子各有多少个 思路:这题的关键在于求相交的矩形区间 给出一个矩形的左下和 ...

  10. PHP获取目录下面所有文件和文件夹

    如果做一个在线的文件管理系统的话,那么首先必须知道怎么读取目录和文件,其实这个功能几行代码就可以实现了. <?php $dir = "D:/";  //要获取的目录 echo ...