第十八章 调试

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. [python]关于在python中模块导入问题追加总结

    [背景] 最近在写程序时,我使用的eclipse编辑器运行都没有问题,然后部署到自动化环境上却偏偏报找不到相应模块问题,现在对该问题在之前的贴子上追加总结 原帖子:[python]关于python中模 ...

  2. RxJS--Subject

    Subject是Observable(可观察对象)的子类,subject是多播的,允许将值多播给多个observer(观察者),普通observable是单播. 每一个Subject都是一个Obser ...

  3. 使用Base64格式的图片制作ICON

    使用Base64格式的图片制作ICON的优势是Base64图片可以减少请求次数:加快首屏数据的显示速度:使用这种方式不会对图片压缩 使用base64工具将图片转成字符串 使用站长工具可以将图片转成字符 ...

  4. Breaking Down Type Erasure in Swift

    Type Erasure Pattern We can use the type erasure pattern to combine both generic type parameters and ...

  5. 3.HBase In Action 第一章-HBase简介(1.1.1 大数据你好呀)

    Let's take a closer look at the term Big Data. To be honest, it's become something of a loaded term, ...

  6. Jmeter函数助手中添加自定义函数

    最近,群里的牛肉面大神有个需求,是将每个post请求的body部分做一个加密操作,其实这个需求不算难,用beanshell引入加密函数的包,然后调用就行了.只是,如果请求多了,每次都要调用一下自己加密 ...

  7. JAVA 第二周学习总结

    20175308 2018-2019-2 <Java程序设计>第二周学习总结 教材学习内容总结: 第二章学习内容: 1.认识标识符与关键字 2.java的八种数据类型,着重记好精度由高到低 ...

  8. day60

    Bootstrap 一.简介 Bootstrap是美国Twitter公司的设计师Mark Otto和Jacob Thornton合作基于HTML.CSS.JavaScript 开发的简洁.直观.强悍的 ...

  9. China Cloud Computing Conference(2018.07.24)

    时间:2018.07.24地点:北京国家会议中心

  10. 20155302《网络对抗》Exp6 信息收集与漏洞扫描

    20155302<网络对抗>Exp6 信息收集与漏洞扫描 实验内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测 ...