《Linux内核设计与实现》读书笔记 第十八章 调试
第十八章调试
18.1 准备开始
需要准备的东西:
l 一个bug:大部分bug通常都不是行为可靠而且定义明确的
l 一个藏匿bug的内核版本:找出bug首先出现的版本
l 相关内核代码的知识和运气
最好能让bug重现,有一些bug存在而且有人没办法让他重现,因为内核与用户程序和硬件间的交互很微妙。
18.2内核中的bug
可以有无数种原因产生,表象也变化多端。代码中的错误往往引发一系列连锁反应,目击者才看到bug。
18.3通过打印来调试
内核提供了打印函数printk()。和C库中的printf()几乎相同。
Printk()的特质:
l 健壮性:任何时候,任何地方都可以调用。仅有的不能调用的情况是在终端还没初始化之前。Early_printk()再启动过程初期就可以打印。
l 日志等级:可以在打印的消息的开头加上记录等级,内核通过记录等级和当前终端的记录登记比较,来决定是否打印。最好给消息加记录等级 ,不然就是默认等级KERN_WARNING。<0>到<7>。
l 记录缓冲区:内核消息保存在一个环形队列中,单处理器默认16k,环形可以新信息覆盖老信息。好处是同步问题容易解决,记录也容易维护。坏处是可能会丢失信息。
l Syslogd和klogd:用户空间的守护进程klogd从记录缓冲区中获取内核消息,再通过syslogd守护进程将它们保存在系统日志。
l Printf()到printk():等啥时候写C语言会把pringf()错写成printk()就行了。
18.4opps
Oops:是内核告知用户有不幸发生的最常用方式。因为内核不能自我修复,也不能将自己杀死,所以只有发oops。通常发完oops,内核会处于不稳定状态。内核必须适当的从当前上下文环境退出并尝试恢复对系统的控制,但一般会死机。寄存器上下文和回溯线索。
l Ksymoops:解析opps信息。Ksymoops save_oops.txt
l 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内核设计与实现》读书笔记 第十八章 调试的更多相关文章
- Linux内核设计与实现 读书笔记 转
Linux内核设计与实现 读书笔记: http://www.cnblogs.com/wang_yb/tag/linux-kernel/ <深入理解LINUX内存管理> http://bl ...
- 《Linux内核设计与实现》课本第十八章自学笔记——20135203齐岳
<Linux内核设计与实现>课本第十八章自学笔记 By20135203齐岳 通过打印来调试 printk()是内核提供的格式化打印函数,除了和C库提供的printf()函数功能相同外还有一 ...
- Linux内核设计与实现 读书笔记
第三章 进程管理 1. fork系统调用从内核返回两次: 一次返回到子进程,一次返回到父进程 2. task_struct结构是用slab分配器分配的,2.6以前的是放在内核栈的栈底的:所有进程的ta ...
- Linux内核设计与实现读书笔记(8)-内核同步方法【转】
转自:http://blog.chinaunix.net/uid-10469829-id-2953001.html 1.原子操作可以保证指令以原子的方式执行——执行过程不被打断.内核提供了两组原子操作 ...
- Linux内核设计与实现——读书笔记2:进程管理
1.进程: (1)处于执行期的程序,但不止是代码,还包括各种程序运行时所需的资源,实际上进程是正在执行的 程序的实时结果. (2)程序的本身并不是进程,进程是处于执行期的程序及其相关资源的总称. (3 ...
- Linux内核设计与实现——读书笔记1:内核简介
内核:有的时候被称管理者或者操作系统核心,通常内核负责响应中断的中断服务程序, 负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间德内存管理程序 和网络,进程间通信等系统服务程序共同组 ...
- Linux内核设计与实现 总结笔记(第八章)下半部和推后执行的工作
上半部分的中断处理有一些局限,包括: 中断处理程序以异步方式执行,并且它有可能打断其他重要代码的执行. 中断会屏蔽其他程序,所以中断处理程序执行的越快越好. 由于中断处理程序往往需要对硬件进行操作,所 ...
- 初探内核之《Linux内核设计与实现》笔记上
内核简介 本篇简单介绍内核相关的基本概念. 主要内容: 单内核和微内核 内核版本号 1. 单内核和微内核 原理 优势 劣势 单内核 整个内核都在一个大内核地址空间上运行. 1. 简单.2. 高效 ...
- Linux内核架构与底层--读书笔记
linux中管道符"|"的作用 命令格式:命令A|命令B,即命令1的正确输出作为命令B的操作对象(下图应用别人的图片) 1. 例如: ps aux | grep "tes ...
随机推荐
- mysql5.6 忘记root密码
1.首先net stop mysql服务,并且切换到任务管理器,有与mysql有关的,最好关闭进程. 2.运行CMD命令切换到MySql安装bin目录,下面是我的mysql安装目录 cd D:\Pr ...
- c#_图表之zeGraph
关于图表控件: http://blog.csdn.net/sgear/article/details/1449025 其中zedGraph的基本方法及属性介绍: http://wenku.baidu. ...
- 【React】dva-cli建立脚手架后发现页面样式不对的问题
用dva-cli作为脚手架建立工程后,开始尝试编写页面.然后立马发现一个坑爹的问题. 在我less文件里面写了一个class ,比如:MainHead. 但是编译出来之后发现css文件里面变成了 Ma ...
- 【Java EE 学习 83 上】【SpringMVC】【基本使用方法】
一.SpringMVC框架概述 什么是SpringMVC?SpringMVC是一个和Struts2差不多的东西,他们的作用和性质几乎是相同的,甚至开发效率上也差不多,但是在运行效率上SpringMVC ...
- CozyRSS开发记录21-默认RSS源列表
CozyRSS开发记录21-默认RSS源列表 1.默认列表 在第一次使用CozyRSS的情况下,我们让它内置五个RSS源吧: 2.响应RSS源的更新 先不处理RSS源列表项的点击,响应下下拉菜单里的更 ...
- gdb的可视化工具安装
红帽推出的insight https://www.sourceware.org/insight/index.php http://wiki.ubuntu.org.cn/Insight%E7%9A%84 ...
- HDU 1848 SG函数博弈
Fibonacci again and again Problem Description 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的:F(1 ...
- 了解 Spring Data JPA
前言 自 JPA 伴随 Java EE 5 发布以来,受到了各大厂商及开源社区的追捧,各种商用的和开源的 JPA 框架如雨后春笋般出现,为开发者提供了丰富的选择.它一改之前 EJB 2.x 中实体 B ...
- Web.xml配置参数详解
1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML版本并给出文件的字符编码.DOCYTPE声明必须立即出现在此头之后.这个声明告诉服务器适用的 ...
- NXP恩智浦P89V52X2单片机破解P89C52X2BA芯片解密技术分享!
NXP恩智浦P89V52X2单片机破解P89C52X2BA芯片解密 P89V52X2是一款带有8kB Flash.256B数据RAM和192B数据EEPROM的80C51微控制器.这个器件可以在完全替 ...