linux内核分析 第18章读书笔记
2016-03-30 23:22
447 查看
十八章 调试
一、内核调试概述
1.需要面对的一个确定的bug 一个藏匿bug的内核版本 相关的内核代码的知识和运气
2.艰难的调试工作
重现bug很困难:大部分bug通常都不是行为可靠而且定义明确的。 确定bug最初出现的内核版本很困难:内核版本更新快,难以确定bug从哪个版本开始出现的。
3.内核中的bug
产生原因众多 表象变化多 从隐藏在源代码中的错误到展现在目击者面前的bug,往往都是经历一系列连锁反应的事件才可能触发。 内核调试事实上与其它大型的软件项目没有什么太大的不同。 内核有一些独特的问题需要考虑:例如定时限制和竞争条件等,都是允许多个线程在内核中同时运行产生的结果。
二、通过打印来调试
printk():内核的格式化打印函数
1.健壮性
弹性极佳的函数:任何时候、任何地方都能调用它 可以在中断上下文和进程上下文中被调用 可以在任何持有锁时被调用 可以在多处理器上同时被调用 除非再启动过程中的初期就要在终端上输出
2.日志等级
printk()和printf()在使用上最主要的区别就是前者可以指定一个日志级别。内核通过这个级别来判断是否在终端上打印消息。 内核把级别比某个特定值低的所有消息显示在终端上。
3.记录缓冲区
内核消息保存在一个LOG_BUF_LEN大小的环形队列中,读写都是按照环形队列方式操作的。 大小是可以在编译时通过CONFIG_LOG_BUF_SHIFT进行调整。 在单处理器的系统上默认值是16kb,即内核在同一时间只能保存16kb的内核消息,再多的话新消息就会覆盖老消息。
4.syslogd和klogd
这是两个用户空间的守护进程,klogd从记录缓冲区中获取内核消息,再通过syslogd守护进程将他们保存在系统日志文件中。 klogd: 既可以从/proc/kmsg文件中,也可以通过syslog()系统调用读取这些消息。 默认是/proc方式。 两种情况klogd都会阻塞,知道有新的内核消息可供读出,唤醒之后默认处理是将消息传给syslogd。 启动时可以通过-c标志来改变终端的记录等级 syslogd: 将它接收到的所有消息添加到一个文件中,默认是/var/log/messages。
三、oops
oops是内核告知用户有不幸发生的最常用的方式。 内核很难自我修复,也不能将自己杀死,只能发布oops,过程: 向终端上输出错误消息 输出寄存器中保存的信息 输出可供跟踪的回溯线索 通常发送完oops之后,内核会处于一种不稳定状态。 oops发生的时机: 中断上下文:内核无法继续,会陷入混乱,导致系统死机 在idle进程或init进程(0号进程和1号进程):内核无法继续,会陷入混乱,导致系统死机 在其他进程运行时,内核会杀死该进程并尝试着继续执行
四、探测系统
1.使用uid作为选择条件一般情况下,加入特性时,只要保留原有的算法而把新算法加入到其他位置上,基本就能保证安全。 可以把用户id(UID)作为选择条件来实现这种功能,通过某种选择条件,安排到底执行哪种算法。
2.使用条件变量
如果代码与进程无关,或者希望有一个针对所有情况都能使用的机制来控制某个特性,可以使用条件变量。 只需要创建一个全局变量作为一个条件选择开关:如果该变量为0,就使用某一个分支上的代码;否则,选择另外一个分支。 操控方式:某种接口,或者调试器。
3.使用统计量
这种方法常用于使用者需要掌握某个特定事件的发生规律的时候。 方法是创建统计量,并提供某种机制访问其统计结果。
相关文章推荐
- 【dotnet跨平台】VSCode Linux 32位和Linux 64位下载地址分享
- CentOS 7上安装WordPress详细步骤
- 20135320赵瀚青LINUX第六周学习笔记
- 《Linux内核分析》第六周学习总结
- 分析Linux内核创建一个新进程的过程
- git linux
- Linux入门学习(五)
- 在linux终端下用命令编辑一个文件并保存
- 用MacOS X的Terminal远程连接CentOS 7
- 《Linux内核》课本读书笔记 第三章
- 查看linux服务器上的一些统计数据
- Linux 命令 解压到制定目录
- Linux内核分析-创建新进程的过程
- 20135220谈愈敏Linux Book_3
- Linux内存共享
- Linux多线程学习笔记
- Linux学习笔记6
- Centos7 平台中对于scikit安装教程的学习
- 【那年那人那linux】“正则表达式”初窥之二则问题
- Linux下Gcc生成和使用静态库和动态库详解