Linux 内核动态打印调试(dev_info、 dev_dbg )

news2024/11/30 2:41:00

目录

前言

1 printk消息级别

2 调整内核printk打印级别 

3 dev_xxx函数简介

4 配置内核使用动态打印

5 动态调试使用方法

6 动态打印调试的基本原理


  •  🎈个人主页🎈:linux_嵌入式大师之路的博客-CSDN博客
  • 🎉🎉🎉欢迎 👍点赞✍评论⭐收藏
  • 🤝希望本文能对你有所帮助,欢迎在评论区交流讨论!🤝

前言

在 kernel 驱动代码中,使用动态输出是系统内核调试的重要手段之一,printk打印是全局的,只能设置输出等级。而动态输出可以动态选择打开某个内核子系统的输出,可以有选择性地打开某些模块的输出,printk被dev_info,dev_dbg,dev_err之类的函数代替,dev_xxx函数的本质还是使用printk打印的,只是对printk进行了一层包装。

1 printk消息级别

Linux 内核共提供了八种不同的消息级别,分为级别 0~7。数值越大,表示级别越低,对应的消息越不重要。相应的宏定义在 include/linux/kern_levels.h 文件中。

#define KERN_SOH   "\001"      /* ASCII Start Of Header */
#define KERN_SOH_ASCII '\001'#define KERN_EMERG      KERN_SOH "0"   /* system is unusable */
#define KERN_ALERT      KERN_SOH "1"   /* action must be taken immediately */
#define KERN_CRIT       KERN_SOH "2"   /* critical conditions */
#define KERN_ERR        KERN_SOH "3"   /* error conditions */
#define KERN_WARNING    KERN_SOH "4"   /* warning conditions */
#define KERN_NOTICE     KERN_SOH "5"   /* normal but significant condition */
#define KERN_INFO       KERN_SOH "6"   /* informational */
#define KERN_DEBUG      KERN_SOH "7"   /* debug-level messages */
  • KERN_ALERT 表示必须立即采取行动的消息;
  • KERN_CRIT 表示临界状态,通常涉及严重的硬件或软件操作失败;
  • KERN_ERR 用于报告错误状态,设备驱动程序会经常使用该级别来报告来自硬件的问题;
  • KERN_WARNING 对可能出现问题的情况进行警告,这类情况通常不会对系统造成严重的问题;
  • KERN_NOTICE 表示有必要进行提示的正常情形,许多与安全相关的状况用这个级别进行汇报;
  • KERN_INFO 表示内核提示信息,很多驱动程序在启动的时候,用这个级别打印出它们找到的硬件信息;
  • KERN_DEBUG 用于调试信息。
  • KERN_EMERG 表示紧急事件,一般是系统崩溃之前提示的消息;

2 调整内核printk打印级别 

通过 /proc/sys/kernel/printk 文件可以调节 printk 的输出等级,该文件有 4 个数字值。例如,在 Ubuntu 上的值如下:

​​

 四个数值的含义如下:

控制台日志级别:优先级高于该值的消息将被打印至控制台;

默认的消息日志级别:将用该优先级来打印没有优先级的消息(即 printk 没有指定消息级别);

最低的控制台日志级别:控制台日志级别可被设置的最小值(最高优先级);

默认的控制台日志级别:控制台日志级别的缺省值。

通过修改 /proc/sys/kernel/printk 中的值来改变内核打印效果。例如,屏蔽掉所有的内核 printk 打印,只需要把第一个数值调到最小值1或者0,指令如下:

echo 1 4 1 7 > /proc/sys/kernel/printk

3 dev_xxx函数简介

下面简述下这几个dev_xxx函数的基本使用规则,以及动态调试使用方式。

  • dev_info(): 启动过程、或者模块加载过程等 “通知类的” 信息等,一般只会通知一次,例如 probe 函数;
  • dev_dbg(): 一般使用在普通错误,如-EINVAL、-ENOMEM 等 errno 发生处,用于调试;
  • dev_err(): 一般使用在严重错误,尤其是用户无法得到 errno 的地方,或者程序员不容易猜测系统哪里出了问题的地方;

4 配置内核使用动态打印

  • 打开内核动态调试开关,打开内核配置选项CONFIG_DEBUG_FS=y,CONFIG_DYNAMIC_DEBUG=y
  • debugfs默认会挂载到/sys/kernel/debug,如果没有挂载,可以执行以下命令挂载: 

        mount -t debugfs none /sys/kernel/debug

5 动态调试使用方法

  • 使用下面方式控制你想输出 dev_dbg() 信息
控制某个文件所有 dev_dbg():
echo -n "file xxx.c +p" > /mnt/dbg/dynamic_debug/control

控制某个函数所有 dev_dbg():
echo -n "func xxx +p" > /mnt/dbg/dynamic_debug/control
  • 运行程序,使用 dmesg 则可以看到相应 dev_dbg() 的输出信息
  • 当调试结束,不再想输出 dev_dbg() 信息了,使用下面命令关闭即可
echo -n "file xxx.c -p" > /sys/kernel/debug/dynamic_debug/control

echo -n "func xxx -p" > /sys/kernel/debug/dynamic_debug/control

例子:

echo -n "file ca_dsc_core.c +p" > /sys/kernel/debug/dynamic_debug/control 则打印ca_dsc_core.c所有的 dev_dbg() 信息
echo -n "func ca_dsc_read +p" > /sys/kernel/debug/dynamic_debug/control 则打印ca_dsc_read()函数所有 dev_dbg() 

上面是打开动态输出语句的例子,除了能输出pr_debug()/dev_dbg()函数中定义的输出信息外,还能输出一些额外信息,如函数名、行号、模块名字以及线程ID等

  • p:打开动态输出语句(可以是某个文件,某个模块,某个函数,或者文件路径包含某个关键字的文件里所有的动态打印语句)
  • f:输出函数名
  • l:输出行号
  • m:输出模块名字
  • t:输出线程ID

另外,还可以在各个子系统的Makefile中添加ccflags来打开动态输出语句

Makefile:
ccflags-y += -DDEBUG
ccflags-y += -DVERBOSE_DEBUG

6 动态打印调试的基本原理

当编译选项CONFIG_DYNAMIC_DEBUG打开的时候,在编译阶段,kernel 会把所有使用 dev_dbg() 的信息记录在一个 table 中,这些信息我们可以从/sys/kernel/debug/dynamic_debug/control解析出来:

# cat /sys/kernel/debug/dynamic_debug/control

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/951521.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中间件环境搭建配置过程解读

中间件环境搭建 目录 中间件环境搭建xampp 搭建环境Tomcat环境配置安装mysql连接mysql 问题解决 xampp 搭建环境 安装xampp服务集成环境工具 官网地址下载项目压缩包,将项目文件夹放在xampp安装目录的htdocs文件夹下初始化xampp:运行目录内的setup_xamp…

【java】【已解决】IDEA启动报错:Lombok Requires Annotation Processing

解决办法: 1、根据异常提示操作: 直接点击错误提示后面的蓝色标识【Enable】(小编点完了所以变灰色),此操作等价于下面的步骤: 【File】-->【Settings】-->【Build】-->【Compiler】-->【Ann…

vue、uniapp如何在js中获取scss的变量

举例:在uniapp中会有一个uni.scss文件,我这边声明了一个$my-nav-bgColor的变量 uni.scss已经预处理过了,我们不需要引入可以直接使用 如果要在js中使用 需要在uni.scss中导出 在你要用的页面引入 就可以正常使用了 自己定义的scss文件…

html中如何用vue语法,并使用UI组件库 ,html中引入vue+ant-design-vue或者vue+element-plus

html中如何用vue语法,并使用UI组件库 前言 先说一下本次应用的场景,本次项目中,需要引入github中别人写好的插件,插件比较大,没有方法直接在自己项目中,把别人的项目打包合并生成html(类似于前…

阿里云效和阿里在线idea使用

阿里云效 https://flow.aliyun.com/all?page1 阿里在线idea:https://ide.aliyun.com/ 在云效中创建的项目可以在在线idea 打开 运行中的项目 设置ssh 设置以后可以使用云效率的代码构建来构建代码 设置 添加自有云或者体验5h

十五、模板方法模式

一、什么是模板方法模式 模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。 模板方法模式包含以…

postgis数据库从一张表中过滤出一部分数据到新表中

你可以使用以下步骤在PostGIS数据库中过滤objectid<100的数据&#xff0c;并将其创建为新表&#xff1a;打开PostGIS数据库的终端或客户端工具&#xff08;如Psql&#xff09;。 选择你要过滤数据的表。假设表名为"original_table"&#xff0c;该表包含一个名为&q…

netmap安装使用

文章目录 1、安装编译netmap2、使用netmap3、运行编写自己的代码 1、安装编译netmap github地址 git clone https://github.com/luigirizzo/netmap 1、进入目录 cd netmap-master/LINUX 2、安装编译环境 apt-get install build-essential 3、初始化配置环境 ./configure 出现这…

若依富文本 html样式 被过滤问题

一.场景 进入页面&#xff0c;富文本编辑框里回显这条新闻内容&#xff0c;如下图&#xff0c; 然后可以在富文本编辑框里对它实现再编辑&#xff0c;编辑之后将html代码提交保存到后台数据库。可以点击详情页进行查看。 出现问题&#xff1a;在提交到后台controller时&#x…

Spring Boot 中是使用 JDK Proxy 动态代理还是 CGLib ?

1. Spring Boot 中是使用 JDK Proxy 动态代理还是 CGLib ? 首先我们知道在 Spring 里面&#xff0c;动态代理的底层&#xff0c;默认使用的是 JDK Proxy 代理&#xff0c;这一点在官方文档有具体的说明&#xff1a; 既然 Spring 中的动态代理默认使用 JDK Proxy&#xff0c;那…

交换机端口安全实验

文章目录 一、实验的背景与目的二、实验拓扑三、实验需求四、实验解法1. PC配置IP地址部分2. 在SW1上开启802.1X身份验证3. 创建一个用户身份验证的用户。用户名为wangdaye&#xff0c;密码为1234564.创建一个端口隔离组&#xff0c;实现三台PC无法互相访问 摘要&#xff1a; 本…

记录 使用 git 克隆仓库报错:Warning: Permanently added‘github.com’ to the .....(ssh )

解决方法&#xff1a; 1. 新建空文件夹->右键->点击 Git Bash Here2. 输入 cd C&#xff1a;3. 输入 cat ~/.ssh/id_rsa.pub4. 输入 ssh-keygen重复回车&#xff0c;生成一个矩形&#xff0c;则说明公钥已经生成了。重复步骤3&#xff0c;生成publickey&#xff0c;右键…

PCL 判断两条线段的平行性(三维空间)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里使用一种比较有趣的方式来判断三维空间中两条线段的平行性,我们都知道两条线段所代表的矢量进行叉乘计算所得数值,代表了由这两条线段组成的平行四边形的面积值,如下图所示: ok,那么如果将此结论推广到三维…

远程工作与协作实践:探讨在网络安全领域中进行远程工作和团队协作的最佳实践和工具推荐

第一章&#xff1a;引言 随着科技的迅猛发展&#xff0c;远程工作已经成为现代职场的一部分。特别是在网络安全领域&#xff0c;远程工作和团队协作变得越来越普遍。本文将探讨在网络安全领域中进行远程工作和团队协作的最佳实践和工具推荐&#xff0c;帮助从业人员更好地应对…

26.仪表板侧边栏菜单

效果 源码 <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Sidebar Menu</title> <link rel="stylesheet" type="text/css"…

DNS原理

文章目录 一、域名产生背景域名的树形层次化结构 二、定义三、DNS查询模式递归查询迭代查询 四、主机域名解析工作流程五、H3C配置DNS代理 首先可以看下思维导图&#xff0c;以便更好的理解接下来的内容。 一、域名 产生背景 在互联网中&#xff0c;通过IP地址访问目标主机…

如何使用Unity制作一个国际象棋

LinnoChess1.0 该项目旨在做一些Unity小游戏项目开发来练练手 如果有更新建议请私信RWLinno 项目地址&#xff1a;https://github.com/RWLinno/LinnoChess 目前效果 能够正常下棋&#xff1b;能够编辑棋盘&#xff1b;能够SL棋局&#xff1b;能够记录棋谱&#xff1b;能够显…

交换机端口安全

文章目录 一、802.1X认证1. 定义和起源2. 认证方式本地认证远程集中认证 3. 端口接入控制方式基于端口认证基于MAC地址认证 二、端口隔离技术1. 隔离组2. 隔离原理3. 应用场景 首先可以看下思维导图&#xff0c;以便更好的理解接下来的内容。 一、802.1X认证 1. 定义和起源 8…

使用PAM保障开发运营安全

硬编码凭据和 DevOps 系统中缺乏凭据安全性是组织的巨大漏洞。以明文形式访问凭据的恶意内部人员可以在 IT 中建立和扩展其立足点 基础设施&#xff0c;构成巨大的数据被盗风险。 什么是PAM 特权访问管理 &#xff08;PAM&#xff09; 是指一组 IT 安全管理原则&#xff0c;可…

全球热喷涂设备预计将以超过4.6%的增长率增长!

热喷涂设备是一种用于将涂层材料喷涂在不同基材表面的技术和设备。这些设备使用热源来将涂层材料加热到熔化或半熔化状态&#xff0c;然后将其喷射到基材上&#xff0c;形成涂层。这种涂层技术可以为基材提供防护、增强、修复和装饰等功能。 根据阿谱尔&#xff08;APO&#x…