38.驱动调试——printk

2023-11-15

printk的用法-mz_linux-ChinaUnix博客

printk函数的用法_wwwlyj123321的博客-CSDN博客_printk

34.Linux-printk分析、使用__FILE__, __FUNCTION__, __LINE__ 调试 - 诺谦 - 博客园

linux驱动——cmdline原理及利用_好习惯成就伟大-CSDN博客_cmdline是什么

linux kernel下输入输出console如何实现_做一个有技术追求的人-CSDN博客_linux如何运行console

printk

驱动调试最常用的是使用printk打印debug信息

printk的输出位置可以由uboot传入的bootargs参数决定:

当uboot的命令行里的“console=tty1”时,表示printk()输出在开发板的LCD屏上

当uboot的命令行里的“console=ttySA0,115200”时,表示printk()输出在串口UART0上,波特率=115200

当uboot的命令行里的“console=tty1 console=ttySA0,115200”时,表示printk()同时输出在串口上,以及开发板的LCD屏上

显然printk(),还是根据命令行参数来调用不同控制台的硬件处理函数

printk()能调用平台输出的原理大致流程:

第一步:uboot中bootargs中的参数之一console=xxx会被 __setup("console=", console_setup);函数调用,最终将控制台的信息放到了console_cmdline[]全局数组中

第二步:驱动入口函数会使用register_console(struct console *console)函数,console结构体中的名字会跟console_cmdline[]全局数组中的信息对比,匹配上就把该结构体注册起来,该结构体指向我们需要用的平台,结构体里有对应的输入输出函数可供使用

第三步:使用printk()的时候,先把打印信息放入缓冲区,再调用release_console_sem();函数,使用注册的console结构中的write函数,让控制台把缓冲区的数据输出给用户。

printk()的打印级别"<0>"至 "<7>"

#define	KERN_EMERG	"<0>"	/* system is unusable			*/
#define	KERN_ALERT	"<1>"	/* action must be taken immediately	*/
#define	KERN_CRIT	"<2>"	/* critical conditions			*/
#define	KERN_ERR	"<3>"	/* error conditions			*/
#define	KERN_WARNING	"<4>"	/* warning conditions			*/
#define	KERN_NOTICE	"<5>"	/* normal but significant condition	*/
#define	KERN_INFO	"<6>"	/* informational			*/
#define	KERN_DEBUG	"<7>"	/* debug-level messages			*/

  printk() 可以这样用:printk(KERN_INFO "Hello, world!\n");。
未指定日志级别的 printk() 采用的默认级别是 DEFAULT_MESSAGE_LOGLEVEL,这个宏在 kernel/printk.c 中被定义为整数 4,即对应KERN_WARNING。

内核日志级别的定义如下


#define MINIMUM_CONSOLE_LOGLEVEL  1   /*可以使用的最小日志级别*/
#define DEFAULT_CONSOLE_LOGLEVEL  7 /*比KERN_DEBUG 更重要的消息都被打印*/
#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */
 
int console_printk[4] = {
DEFAULT_CONSOLE_LOGLEVEL,/*控制台日志级别,优先级高于该值的消息将在控制台显示*/
/*默认消息日志级别,printk没定义优先级时,打印这个优先级以上的消息*/
DEFAULT_MESSAGE_LOGLEVEL,
/*最小控制台日志级别,控制台日志级别可被设置的最小值(最高优先级)*/
MINIMUM_CONSOLE_LOGLEVEL,
DEFAULT_CONSOLE_LOGLEVEL,/* 默认的控制台日志级别*/
};

使用cat /proc/sys/kernel/printk可以查看当前日志使用的各个打印级别

当default_message_loglevel<DEFAULT_CONSOLE_LOGLEVEL时,printk()才会打印出信息

但无论当前控制台日志级别是何值,即使没有在控制台打印出来,可以通过使用dmesg命令查看日志,不论打不打印,日志都会存放在缓冲区。

日志级别的设置

1.通过修改 /proc/sys/kernel/printk  来更改printk打印级别通过

# echo "1 4 1 7" > /proc/sys/kernel/printk来将console_loglevel设为1,让default_message_loglevel默认值大于console_loglevel 值,不满足打印条件,即可屏蔽打印。

缺点就是内核重启后, /proc/sys/kernel/printk的内容又会恢复初值,等于"7 4 1 7"

2.直接修改内核文件

直接修改_call_console_drivers ()函数(位于kernel\printk.c)里的DEFAULT_CONSOLE_LOGLEVEL或者DEFAULT_MESSAGE_LOGLEVEL,使得DEFAULT_MESSAGE_LOGLEVEL>DEFAULT_CONSOLE_LOGLEVEL就可屏蔽打印信息,要打印反过来即可。

3.修改uboot的bootargs参数,

如将uboot命令行里的“console=ttySA0,115200”改为“loglevel=0 console=ttySA0,115200”,表示设置内核的console_loglevel 值=0

使用printk()进行驱动调试

//#define DBG_PRINTK printk  /*调试时候使用,不调试时注释*/
#define DBG_PRINTK(x...)     /*不调试时候使用,调试时注释,所有DBG_PRINTK就会无效*/
DBG_PRINTK(KERN_DEBUG"%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
//__FILE__:    表示文件路径
//__FUNCTION__: 表示函数名
//__LINE__:    表示代码位于第几行
//KERN_DEBUG:   等于7,表示打印级别为7

把该语句在驱动代码中插入到每行需要调试的地方即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

38.驱动调试——printk 的相关文章

  • numpy 未定义符号:PyFPE_jbuf

    我正在尝试使用一百万首歌曲数据集 为此我必须安装 python 表 numpy cython hdf5 numexpr 等 昨天我设法安装了我需要的所有内容 在使用 hdf5 遇到一些麻烦之后 我下载了预编译的二进制包并将它们保存在我的 b
  • gethostbyname() 或 getnameinfo() 如何在后台工作?

    How gethostbyname or getnameinfo 在后台工作 include
  • 无法安装 WWW::Curl::Easy: SZBALINT/WWW-Curl-4.17.tar.gz : make NO

    我正在尝试在我的 Fedora 26 机器上安装 WWW Curl Easy gcc c I usr include D REENTRANT D GNU SOURCE O2 g pipe Wall Werror format securit
  • 如何让“grep”从文件中读取模式?

    假设有一个很大的文本文件 我只想打印与某些模式不匹配的行 显然 我可以使用egrep v patter1 pattern2 pattern3 现在 如果所有这些模式都在一个文本文件中怎么办 最好的制作方法是什么egrep从文件中读取模式 g
  • 从 TypeScript 运行任何 Linux 终端命令?

    有没有办法直接从 TypeScript 类中执行 Linux 终端命令 这个想法是做类似的事情 let myTerminal new LinuxTerminal let terminalResult myTerminal run sudo
  • 适用于 KDE 和 Gnome 的 Gui [重复]

    这个问题在这里已经有答案了 我想为一个现在是 CLI 的应用程序编写一个 gui 它需要在 KDE 和 Gnome DE 中 看起来不错 充分利用用户的外观设置 如果我选择 Qt 或 GTK 我能够做到这一点吗 它们与两个 DE 集成良好吗
  • 如何查找连接到 AF_INET 套接字的客户端的 UID?

    有什么方法或类似的东西ucred for AF UNIX如果是AF INET插座 TCP在我的例子中 找出连接到我的套接字的客户端的UID 还有 proc net tcp但它显示了UID of the creator插座的而不是连接的cli
  • 设置 Apache POI 的路径

    我想创建 Excel 文件并使用 java 程序在该文件中写入数据 That is here http www techbrainwave com p 554我在 java 文件所在的位置提取了 Apache POI 并将该路径包含在路径变
  • Linux shell 脚本中的 while 循环超时

    这工作正常 无限循环 while TRUE do printf done 我在尝试着timeout this while loop与timeout命令 所有这些都不起作用 timeout 5 while TRUE do printf don
  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对
  • 在主目录中安装库

    在 Linux Ubuntu 中 我尝试运行一个工具 但它显示错误 库丢失 我无权在系统中安装任何内容 或者根本无法从我的用户帐户执行 sudo 是否可以在我的主目录 没有 sudo 中安装缺少的库 在我的例子中为 libstdc so 6
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 在 Linux 中禁用历史记录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 要在 Linux 环境中禁用历史记录 我执行了以下命令 export HISTFILESIZE 0 export HISTSIZE 0 u
  • Godaddy 托管上的 CakePHP 控制台

    我一直在努力让我的 CakePHP 网站在 Godaddy 网格托管 帐户上运行 我的蛋糕应用程序设置是从帐户的子目录托管的 并且可以通过子域访问 我必须调整我的 htaccess 文件才能使其正常工作 现在我需要让 CakePHP 控制台
  • xsel -o 对于 OS X 等效项

    是否有一个等效的解决方案可以在 OS X 中抓取选定的文本 就像适用于 Linux 的 xsel o 一样 只需要当前的选择 这样我就可以在 shell 脚本中使用文本 干杯 埃里克 你也许可以安装xsel在 MacOS 上 更新 根据 A
  • 何时使用 pthread 条件变量?

    线程问题 看来 只有在其他线程调用 pthread cond notify 之前调用 pthread cond wait 时 条件变量才起作用 如果在等待之前发生通知 那么等待将被卡住 我的问题是 什么时候应该使用条件变量 调度程序可以抢占
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别
  • 在 Linux 上更快地分叉大型进程?

    在现代 Linux 上达到与 Linux 相同效果的最快 最好的方法是什么 fork execve combo 从一个大的过程 我的问题是进程分叉大约 500MByte 大 并且一个简单的基准测试只能从进程中实现约 50 个分叉 秒 比较最
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内
  • Android:ANT 构建失败,并显示 google-play-services-lib:“解析为没有项目的 project.properties 文件的路径”

    我正在尝试使用 ANT 构建我的应用程序 但在包含 google play services lib 库项目后 我惨遭失败 Step 1 我在 project properties 文件中设置了对库项目的引用 android library

随机推荐

  • 10个好用又有趣的工具类网站,赶快收藏吧

    YwTools 工具集合 www ywcoding com YwTools是一个提供许多有趣小工具的网站 这些工具能够为用户提供方便 快捷的支持 它提供许多实用性工具 比如生产力工具 免注册流程图 文本对比去重 编程类工具比如文本解码编码
  • 使用Appuploader工具将IPA上传到App Store的最新流程和步骤

    苹果官方提供的工具xcode上架ipa非常复杂麻烦 用appuploader 可以在 mac 和windows 上制作管理 证书 无需钥匙串工具 条件 1 以Windows为例 创建app打包ios需要的证书和描述文件 2 准备好一个苹果开
  • Xilinx FIFO IP核的例化和使用(含代码实例)

    使用FPGA进行数据传输处理时 数据缓存是很关键的部分 FIFO作为一种简单的缓存方案 在FPGA开发中具有广泛的应用 Xilinx为我们提供的FIFO IP核是一种先进先出 FIFO 内存队列 例化后 开发人员可自定义宽度 深度 状态标志
  • Android Menu详解

    菜单的分类 菜单是Android应用中非常重要且常见的组成部分 主要可以分为三类 选项菜单 上下文菜单 上下文操作模式以及弹出菜单 它们的主要区别如下 1 选项菜单是一个应用的主菜单项 用于放置对应用产生全局影响的操作 如搜索 设置 2 上
  • 随机采样方法整理与讲解(MCMC、Gibbs Sampling等)

    本文是对参考资料中多篇关于sampling的内容进行总结 搬运 方便以后自己翻阅 其实参考资料中的资料写的比我好 大家可以看一下 好东西多分享 PRML的第11章也是sampling 有时间后面写到PRML的笔记中去 背景 随机模拟也可以叫
  • 解决VS Code集成终端中Node命令不可用的问题

    问题 VS Code集成终端中输入node v提示 node 不是内部命令 解决方法 1 右键点击VS Code启动图标 选择属性 2 点击兼容性选项卡 3 勾选以管理员身份运行 4 打开VS Code集成终端 输入node v 成功
  • html5 js获取设备信息,js怎么获取电脑硬件信息

    想知道怎么获取电脑的硬件信息吗 下面是学习啦小编带来js怎么获取电脑硬件信息的内容 欢迎阅读 js怎么获取电脑硬件信息 1 写一个js获取userAgent属性的html文件 文件内容如下 alert window navigator us
  • Golang Map原理(底层结构、查找/新增/删除、扩缩容)

    参考 解剖Go语言map底层实现 Go语言核心手册 3 字典 一 Go Map底层结构 Go map的底层实现是一个哈希表 数组 链表 使用拉链法消除哈希冲突 因此实现map的过程实际上就是实现哈希表的过程 先来看下go map底层的具体结
  • SVN账号密码查找

    1 根据路径找到svn simple C Users Administrator AppData Roaming Subversion auth svn simple 2 执行 TSvnPwd exe 查看用户名 密码
  • Related work怎么写?

    傍晚找师兄改论文的related work 师兄一边改related work 一边教我如何写related work 小白鼠记录师兄的related work写作宝典如下 Related work精神 related work不需要写得特
  • 从键盘输入字符串,判断是否为回文字符串。 回文字符串:如果一个字符串,从前向后读和从后向前读,都是一个字符串,则称为回文串,比如adminnimda,dad,mommom。 源程序:

    package Experiment Java test14 import java util Scanner public class test04 public static void main String args Scanner
  • 嵌入式开发概述(树莓派介绍)

    目录 嵌入式定义 嵌入式芯片选型 ARM架构 ARM树莓派 嵌入式定义 国内普遍认同的嵌入式系统的定义是以应用为中心 以计算机技术为基础 软硬件可裁剪 适应应用系统对功耗 可靠性 成本 体积 功耗等严格要求的专用计算机系统 嵌入式系统是软件
  • WPF Virtualization

    WPF虚拟化技术分为UI 虚拟化和数据虚拟化 第一种方法被称为 UI 虚拟化 支持虚拟化用户界面的控件是足够聪明来创建只显示的是实际在屏幕上可见的数据项目所需的 UI 元素 例如 假设我们有一个滚动的列表框是绑定到 1 000 000 项目
  • 微信小程序上线流程

    1 打开微信公众平台扫码登录 2 点击成员管理 我是接的别人开发的版本 首先要管理员给我权限 让我成为小程序的开发者 按下图就可以添加成员了 你要是开发者直接要他给你全勾上 最后点击确认添加就行 3 点击微信开发者工具里的上传按钮或者hbu
  • C++项目实战-实际应用

    目录 典型IO的两个阶段 网络IO Linux上的五种IO模型 1 阻塞 blocking 2 非阻塞 3 IO复用 4 信号驱动 5 异步 Web Server HTTP协议 应用层的协议 简介 概述 工作原理 HTTP 请求报文格式 H
  • 秒传的原理

    在本文中 我们将介绍网盘秒传的基本原理和实现方法 以及秒传的优缺点和应用场景 网盘秒传的基本原理 网盘秒传的基本原理是利用哈希算法 如MD5或SHA 1 对文件进行特征值提取 然后与服务器上已有的文件特征值进行比对 如果发现相同的特征值 就
  • C语言实现贪吃蛇小游戏

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 贪吃蛇实现的结构和方式 2 对窗口进行设置 3 对蛇进行初始化 一 源代码 利用学会的知识做点小游戏 前言 控制台的欢乐就是这么简单 提示 以下是本篇文章
  • Vue3 Table 性能优化,减少 85% 渲染耗时

    大厂技术 高级前端 Node进阶 点击上方 程序员成长指北 关注公众号 回复1 加入高级Node交流群 原文链接 https juejin cn post 7194516447932973112 作者 dev zuo 前段时间公司有一个比较
  • 一个新的开始(非技术贴)

    谈谈一个新的开始 说实话 从来没想过自己会有一刻坐在这里写博客 因为一直以来都觉得自己会像父母所期望的那样考上公务员 结婚生子 过平凡的一生 从大一以来 自己都一直坚信这样对我来说是最最好的 但今年大三 用了短短一个月我就改变了想法 可以说
  • 38.驱动调试——printk

    printk的用法 mz linux ChinaUnix博客 printk函数的用法 wwwlyj123321的博客 CSDN博客 printk 34 Linux printk分析 使用 FILE FUNCTION LINE 调试 诺谦 博