第十八章 调试

0.总结

  • oops
  • 内核的调试配置
  • 用Git进行二分搜索
  • bug总会有,简洁描述发给LKML

1. 准备开始

  • 在用户级的程序里,bug表现比较直接;在内核中却不清晰。

2. 内核中的bug

  • 多种多样、变化多端。
  • 引用空指针会产生一个oops;垃圾数据会导致系统崩溃。
  • 定时限制和竞争条件都允许多个线程在内核中同时运行产生的结果。

3. 通过打印来调试

3.1 健壮性

  • printk()函数任何时候地方都可以调用它。

3.2 日志等级

  • printk()可以指定一个日志级别【与printf()最大区别】。

  • 内核判断是否在终端上打印消息的依据。

  • 指定一个记录级别的方式:

  • KERN_WARING和KERN_DEGUG是<linux/kernel.h>中的简单宏定义。

  • 内核用指定的记录等级和当前终端的记录等级console_loglevel来决定是不是向终端上打印。

  • 默认级别:KERN_WARNING。

  • 按照自己想法赋予记录等级方法:

3.3 记录缓冲区

3.4 syslogd和klogd

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

  • 错误中培养新习惯。

4. oops

  • 内核告知用户有不幸发生的最常见方式。
  • 内核发布oops会向终端输出的内容:
1.错误消息;
2.寄存器中保存的信息;
3.可供跟踪的回溯线索。
  • oops发生时间出现的状况:

  • oops包含信息:

4.1 ksymoops

  • 将回溯线索中的地址转化成符号名称,调用ksymoops命令并提供System.map:
ksymoops saved_oops.txt

4.2 kallsyms

  • CONFIG_KALLSYMS 定义配置选项启用。
  • CONFIG_KALLSYMS_ALL 存放函数名称;存放所有符号名称。
  • CONFIG_KALLSYMS_EXTRA_PASS 引起内核构建中再次忽略内核的目标代码。

5. 内核调试配置选项

  • 在内核配置编辑器的内核开发菜单项中,依赖CONFIG_DEBUG_KERNEL。

6. 引发bug并打印信息

  • 常用BUG()和BUG_ON()。
  • 调用会引发oops

7. 神奇的系统请求键

  • 通过定义CONFIG_MAGIC_SYSRQ配置选项来启用。
  • 内核可以通过特殊的组合键和内核进行通信。
  • sysctl来标记该特性的开或关。需要启用时:
echo 1 > /proc/sys/kernel/sysrq

8. 内核调试器的传奇

8.1 gdb

  • 针对内核启动调试器的方法和对进程的方法大致相同:
gdb vmlinux /proc/kcore
vmlinux文件是未压缩的内核映像;
/proc/kcore是一个参数选项,作为core文件来用,只有超级用户才能读取此文件的数据。
  • 打印一个变量的值:
p global_variable
  • 反汇编一个函数:
disassemble function
  • 局限性:
不能修改内核数据;
不能单步执行内核代码;
不能加断点

8.2 kgdb

  • 是一个补丁,可在远端主机上通过串口利用gdb的所有功能对内核进行调试。

9. 探测系统

9.1 用UID作为选择条件

  • 利用把用户id(UID)作为选择条件实现新算法加入:

9.2 使用条件变量

  • 使用前提:
代码与进程无关;
希望有一个针对所有情况都能用的机制来控制某个特性。
  • 只需创建一个全局变量作为一个选择开关。

9.3 使用统计量

  • 提供某种机制访问其统计结果。

9.4 重复频率限制

  • 为了避免调试信息发生井喷,可以每隔几秒执行一次操作。

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

11. 使用Git进行二分搜索

$ git bisect start  ;进行二分搜索
$ git bisect bad <revision> ;引发提供一个出现问题的最高内核版本
$ git bisect bad ;若当前内核版本就是bug的元凶,那不必提供内核版本
$ git bisect good v2.6.28 ;最新可正常运行的内核版本 $ git bisect good ;这个版本正常
$ git bisect bad ;这个版本有异常

12. 当所有努力都失败时:社区

  • Linux内核邮件列表(LKML)

2013337朱荟潼 Linux第十八章读书笔记——调试的更多相关文章

  1. 2013337朱荟潼 Linux第五章读书笔记——系统调用

    摘要: [20135337朱荟潼]原创作品转载请注明出处 第五章 系统调用 5.1 与内核通信 中间层 作用三个:1.为用户空间提供一种硬件的抽象接口:2.保证系统稳定和安全:3.除异常和陷入,是内核 ...

  2. 2013337朱荟潼 Linux第四章读书笔记——进程调度

    第4章 进程调度 0. 总结 调度:调度是一个平衡的过程.一方面,它要保证各个运行的进程能够最大限度的使用CP:另一方面,保证各个进程能公平的使用CPU. 调度功能:决定哪个进程运行以及进程运行多长时 ...

  3. 2013337朱荟潼 Linux第三章读书笔记——进程管理

    第三章 进程管理 总结 fork创造的子进程复制了父进程资源,包括内存及进程描述符的内容,资源的复制而不是指针的复制. vfork的行为更像一个线程(指没有自已独立的内存空间),更明显的是vfork的 ...

  4. 2013337朱荟潼 Linux第一章读书笔记——Linux内核简介

    一.Unix历史 二.Linux足迹 类Linux系统.非商业化产品.用途广泛 三.操作系统和Linux内核简介 1.操作系统 (1)是指在整个最基本功能系统中负责完成最基本功能和系统管理的部分. ( ...

  5. 2013337朱荟潼 Linux第二章读书笔记——从内核出发

    1.获取内核源码 1.1Git 分布式的:下载和管理Linux内核源代码: - 获取最新提交到版本树的一个副本 $ git clone git://git.kernel.org/pub/scm/lin ...

  6. 2013337朱荟潼 Linux&深入理解计算机系统第七章读书笔记——链接

    第七章--链接 0.总结 链接编译时可以采用静态链接或动态链接. 连接器主要任务:符号解析和重定位. 多个目标文件可定义相同的符号,可以被连接到一个单独的静态库. 链接器可以生成部分链接的可执行文件 ...

  7. 20135320赵瀚青LINUX第十八章读书笔记

    概述:调试工作艰难是内核级开发区别于用户级开发的一个显著特点 18.1准备开始 内核调试往往是一个令人挠头不已的漫长过程.幸运的是,在这些费劲的问题中也有不少比较简单而且容易消灭的小bug,运气好你可 ...

  8. 20135337朱荟潼 Linux第五周学习总结——扒开系统调用的三层皮(下)

    朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 一.学习内容 (一 ...

  9. 20135337朱荟潼 Linux第一周学习总结——计算机是如何工作的

    朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC-1000029000 1.冯诺依曼体系结 ...

随机推荐

  1. HTML标签之marquee

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zkn_CS_DN_2013/article/details/25229719 <html> ...

  2. 修改Lotus notes默认浏览器

    notes收到的邮件里面的链接,点了以后会自动在notes里打开,但notes很弱,加载页面总是有问题.怎么才能让他默认用ie浏览器打开呢,怎么设置,请教达人. 右下角有个office->Edi ...

  3. ELK日志收集分析平台 (Elasticsearch+Logstash+Kibana)使用说明

    使用ELK对返回502的报警进行日志的收集汇总 eg:Server用户访问网站返回502 首先在zabbix上找到Server的IP 然后登录到elk上使用如下搜索条件: pool_select:X. ...

  4. Arthas开源项目

    本文主要围绕着Arthas是什么.能做什么.安装和使用等三个方面内容来讲解,希望对初学者和对此有兴趣的朋友有帮助. 一. Arthas是什么 文档地址: https://alibaba.github. ...

  5. OpenCV 中轮廓包裹的几个函数boundingRect、minAreaRect、minEnclosingCircle用法

    当我们得到对象轮廓后,可用boundingRect()得到包覆此轮廓的最小正矩形,minAreaRect()得到包覆轮廓的最小斜矩形,minEnclosingCircle()得到包覆此轮廓的最小圆形, ...

  6. create_buffer_tree example

    假设这样一种情况: 绕线完修完timing 后,designer 修改了netlist,给了eco.v,其中改动了 clock tree 的一个分支,导致这个分支上的buffer 都没有了,如下图 一 ...

  7. css 字体、文本、padding的样式

    一.字体的样式: 1)字体倾斜:font-style:italic 2)字体大小:font-size 一般为偶数. 3)行高:line-height   当行高为奇数的时候,是文字上面比文字下面的少一 ...

  8. JAVA框架 SpringMVC RequestMapping讲解

    一.窄化请求映射 在class上做RequestMapping注解. 好处:避免在同一个项目中和其他人的url重复,出现请求混乱问题,便于管理. @Controller @RequestMapping ...

  9. Kafka设计解析(二十一)关于Kafka幂等producer的讨论

    转载自 huxihx,原文链接 关于Kafka幂等producer的讨论 众所周知,Kafka 0.11.0.0版本正式支持精确一次处理语义(exactly once semantics,下称EOS) ...

  10. C语言各种数据类型取值范围

    速查表: char -128 ~ +127 1Byte -2^7 ~ 2^7-1 unsigned char 0 ~ 255 1Byte 0 ~ 2^8-1 short -32767 ~ + 3276 ...