18.3 通过打印来调试

printk

18.3.1 健壮性

任何时候,任何地方都可以调用printk,可以在中断上下文和进程上下文中被调用;可以在任何持有锁时被调用;可以在多处理器上同时被调用。

在系统启动过程中,终端还没有初始化之前,在某些地方不能使用它。Printk的变体函数——early_printk(),能够更早的工作。

18.3.2 日志等级

18.3.3 记录缓冲区

内核消息都被保存在一个LOG_BUF_LEN大小的环形队列中。该缓冲区大小可以在编译时通过设置CONFIG_LOG_BUF_SHIFT进行调整。在单处理器的系统上其默认值是16KB,

即内核在同一时间只能保存16KB的内核消息。

环形队列,很容易解决同步问题,所以即使在中断上下文中也可以方便地使用printk。

18.3.4 syslogd和klogd

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

18.4 oops

Oops是内核告知用户有不幸发生的最常用方式。

这个过程包括向终端上输出错误消息,输出寄存器中保存的信息和回溯线索。

18.4.1 ksymoops

18.4.2 kallsyms

存放着内核镜像中相应函数地址的符号名称

18.5 内核调试配置选项

Kernel hacking菜单栏下

18.6 引发bug并打印信息

BUG_ON() BUG()---错误信息打印和栈回溯

Panic()---打印错误信息,挂起整个系统

Dump_stack()---打印回溯信息

18.7 神奇的系统请求键

SysRq(系统请求)键。配置文件中CONFIG_MAGIC_SYSRQ宏控制,当该功能被启用的时候,无论内核处于什么状态,都可以通过特殊的组合键跟内核进行通信。

系统请求键是调试和挽救垂危系统所必须的一种工具。

18.8 内核调试的传奇

18.8.1 gdb

18.8.2 kgdb

18.9 探测系统

18.9.1 用UID作为选择条件

如果开发的是进程相关的部分。

可以利用把用户id(UID)作为选择条件来实现这种功能。

If(current->uid != 7777){

/*老算法*/

}else{

/*新算法*/

}

可以新建一个UID为7777的用户,专门来测试新算法。对于要求很严格的进程相关的代码来说,这种方法使得测试变得容易了许多。

18.9.2 使用条件变量

18.9.3 使用统计量

可以在/proc下创建一个文件。

18.9.4 重复频率限制

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

18.3 通过打印来调试相关推荐

  1. java判断字符串st6_是否包含st5_第 18 章 在机器指令级调试

    第 18 章 在机器指令级调试 本章介绍如何在机器指令级使用事件管理和进程控制命令.如何显示指定地址处的内存内容以及如何显示源代码行及其相应的机器指令.next 命令.step 命令.stop 命令和 ...

  2. 东软医疗打印设置java,关于单据打印的调试方法常见问题与使用技巧

    3.3.4.6.1什么是单据打印? 流程运转到特定的节点,需要把流程数据打印出来,这种根据流程数据生成特定格式文件的过程叫做单据打印. 单据打印首先需要根据用户的对打印的要求制作一个单据模板. 1, ...

  3. 图形界面终端下打印内核调试信息

    (备份) 很多比较新的Linux系统中(如Fedora 16),如果要在图形界面的终端下调试一个内核模块,printk()函数的输出信息是在终端下显示不出来的,需要查看/var/log/message ...

  4. 没有串口,如何打印单片机调试信息?

    输出调试信息是嵌入式开发中必不可少的调试利器,嵌入式开发的一个特点是很多时候没有操作系统,或者没有文件系统,常规的打印log到文件的方法基本不适用. 最常用的是通过串口输出uart log,例如51单 ...

  5. php 控制台打印_php调试利器:FirePHP的安装与使用

    php中文网最新课程 每日17点准时技术干货分享 做开发的人都知道,我们可以利用浏览器的控制台来调试JavaScript脚本,但是对于像php这种服务端的脚本,你知道如何调试吗?今天给大家推荐一个ph ...

  6. 实例 18错误输出信息与调试信息

    package test;/*** @author 年浩**/ public class test {/*** @param args*/public static void main(String[ ...

  7. Linux内核设计与实现 第18章 调试

    调试工作艰难是内核级开发区别于用户级开发的一个显著特点.相比于用户级开发,内核调试的难度确实要艰苦得多.更可怕的是,它带来的风险比用户级别更高,内核的一一个错误往往立刻就能让系统崩溃. 驾驭内核调试的 ...

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

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

  9. Linux内核分析 读书笔记 (第十八章)

    第十八章 调试 18.1 准备开始 1. 需要的只是: 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 2. 在跟踪bug的时候,掌握的信息越多越好. 18.2 内核中的bug 1.  ...

  10. 第3章 Linux内核调试手段之内核打印

    开始 前面说的话 在我写代码的生涯里,我看到过很多大神炫耀自己的调试手段,也看到很多大神写过非常厉害的代码,我认为,相比于写代码,调试更加重要,而那些能在写代码的时候就加入了自己的调试信息的,就更加厉 ...

最新文章

  1. admui 能再php上用吗,Javascript 方法
  2. 离线地图显示连接服务器未打开,如何在uwp中使用OSM离线地图?没有可用的互联网连接时出现问题...
  3. 机器学习:SVM训练,SMO算法描述,启发式选择样本或变量
  4. mysql group_concat时间用法
  5. 对两个字符串进行比较,取出两个字符串中一样部分的长度
  6. 360修复导致服务器,桌面安装360软件修复漏洞补丁导致桌面TC端无法登陆,FC端VNC登陆一键修复显示HDC不可达...
  7. java overriding_JAVA概念:Overloading与Overriding
  8. webpack打包VUE项目读取外部配置文件,灵活配置域名
  9. deleter mysql,如何通过env文件传递docker中的环境变量?
  10. 2018.07.09 顺序对齐(线性dp)
  11. Fiddler 抓包工具2 - 全网最全最细教程,没有之一
  12. php读取excel文件_在PHP中读取Excel文件
  13. Linux 根目录结构,英文全称、文件夹作用
  14. 微信小程序-菜谱APP
  15. 什么叫「人的格局」?是否有必要培…
  16. 最终幻想-核心危机中魔石融合附全能力详细教学
  17. 【Docker】搭建Docker私库Harbor
  18. 建土赛事——力学架构 下篇
  19. 常见面试题整理--数据库篇(每位开发者必备
  20. 人工智能技术应用就业前景和就业方向

热门文章

  1. Java基础知识强化之IO流笔记19:FileOutputStream的三个write方法
  2. FCKEditor v2.6.3 最新版-ASP.NET 演示程序
  3. MessageBox.Show常用的2个方法
  4. java教程:十分钟理解Java中的弱引用
  5. Ubuntu 16.04安装SoapUI工具进行接口测试(Web Service/WSDL/RESTfull)
  6. 利用 Kubernetes Service 的 selector 无痛运维在线 pod
  7. 愚人节的礼物 栈
  8. Postgresql 插入json数据
  9. GC root 解决了循环引用的垃圾回收问题
  10. puppetmaster 自动签名