【Linux】驱动内核调试,是需要几板斧的

news2024/11/26 17:35:35

目录

前言:

一、基础打印工具

 (1)printk---最常用

①Log Buffer:

②Console:

③RAM Console:

(2)动态打印

①动态打印与printk之间的区别联系

②动态打印常用的例子

③动态打印转为printk正常打印

 (3)dump_stack---分析源码的利器

(4)操作寄存器命令---硬件测试

①devmem---系统层面

②ioremap---内核层面

③ /dey/mem---应用层面

二、特殊场景下的打印工具

(1)Oops内核崩溃:

(2)休眠唤醒:

(3)Linux错误码:

(4)Linux kernel中计算代码运行时间:

(5)debugfs


前言:

在VS code编程时我们编写程序时都有输出打印信息,方便查找问题,那么驱动内核的调试是否也有相应方法进行调试呢?这个答案是肯定的。

工欲善其事,必先利其器,所以驱动内核调试方法的掌握,是非常有必要的。

参考学习:

https://xuesong.blog.csdn.net/article/details/113062813

https://xuesong.blog.csdn.net/article/details/109522945?spm=1001.2014.3001.5502

Linux内核常用调试手段介绍-Linux笔记

开发环境:

imx6ull pro开发板 

Linux 4.9.88内核 

一、基础打印工具

 (1)printk---最常用

这里它有三个方向去输出,如下图所示:

①Log Buffer:

  • 该Buffer里面的内容可以存储在/proc/kmsg
  • 示例:https://blog.csdn.net/weixin_42373086/article/details/130545341?spm=1001.2014.3001.5501 在这里,使用了很多printk打印信息,可以使用dmesg命令查看。

②Console:

  • Console的实现可以很多,目前我们用到的有UART Console(串口)

③RAM Console:

  • 允许将调试日志信息写入一个被称为RAM Console的设备。
  • 这个主要用于解决系统内核崩溃问题,临终时会将一些日志存储在这里方便后续排查。

 这里有很多打印信息,谁优先打印就是一个问题。

这里printk有8个等级,从0到7,优先级依次降低。

通常通过修改/proc/sys/kernel/printk来设置打印。

cat /proc/sys/kernel/printk

//打开所有的内核打印
echo 8> /proc/sys/kernel/printk

 小于阈值的打印信息,都将输出到控制台上。

(2)动态打印

①动态打印与printk之间的区别联系

  • 在系统运行时,动态打印可以由系统维护者动态打开内核子系统的打印,可以有选择性地打开某些模块的打印。
  • 而printk是全局的,只能设置打印等级。要使用动态打印,必须在内核设置时打开CONFIG_DYNAMIC_DEBUG。
  • 动态打印也有相应的设备节点:/sys/kernel/debug/dynamic_debug。常用于高速设备。

可以打印函数名(f)、行号(l)、模块名字(m)以及线程ID(t)。

②动态打印常用的例子

1.打开一个文件中所有动态打印语句

echo -n "file gadget.c +p">

2.打开一个模块中所有动态打印语句

echo -n "module dwc3 +p">

3.打开一个函数中所有动态打印语句

echo "func svc_process +p">

4.打开文件路径中包含usb的文件里所有的动态打印语句

echo -n "*usb* +p">

③动态打印转为printk正常打印

开机的时候,没法操作这个动态打印的节点,能否把动态打印转换成默认的printk正常打印,这个如何实现?

在c文件开头添加:

//重定义
#undef dev_dbg
#define dev_dbg dev_info
#undef pr_debug
#define pr_debug pr_info

 (3)dump_stack---分析源码的利器

分析一个函数的底层调用,离不开dump_stack,因为它是对内核调用栈的打印;当我们不清楚系统回调函数上下文,使用这个方法是非常好的。

具体demo案例:参照文章

https://xuesong.blog.csdn.net/article/details/113062813

(4)操作寄存器命令---硬件测试

①devmem---系统层面

它的原理以及应用场景:

  • 硬件工程师将硬件设计好时,需要进行简单的测试,来查看CPU是否可以正确地读取新硬件系统。
    • 正规的Linux操作方式下,是要有硬件的驱动程序才能完成这个需求。
    • 测试需求只是为了实现简单硬件寄存器读写工作时,devmem命令就非常的适用了。
  • 它的原理就是把硬件的地址空间ioremap映射到用户空间。

具体使用方法,可以参照:

https://xuesong.blog.csdn.net/article/details/113283070

②ioremap---内核层面

实现的核心代码:

#define GPIO0_DDR_BASE       ((uint32_t)0xE7A01014) 

static volatile uint32_t *GPIO0_ddr_vreg;
uint32_t val = 0;
GPIO0_ddr_vreg = (uint32_t *)ioremap(GPIO0_DDR_BASE, 4); 
val = readl(GPIO0_ddr_vreg);
printk("val = %ld\n",val);

③ /dey/mem---应用层面

应用层操作寄存器首先需要将内核映射到核外空间,内核已经提供了一个 /dey/mem 的文件接口,这个文件相当于整个系统内存所在,将该文件打开然后指定需要映射的内存的位置即可。需要注意的是,一般 map 映射的是一段内存地址空间。

具体使用方法:

https://xuesong.blog.csdn.net/article/details/114156170

二、特殊场景下的打印工具

(1)Oops内核崩溃:

当我们遇到内核崩溃,比如空指针异常、内存访问越界。这时我们只能靠崩溃之后打印出来异常调用栈信息来定位Oops的位置和原因。

举个例子: 

在第三行error:Oops信息 kernel BUG at../drivers/mmc/host/sdhci.c  那一行可以简要告知我们是哪里发生问题触发Oops。

(2)休眠唤醒:

我们使用的多个模块都会使用到休眠唤醒,每个休眠唤醒都会有相应的休眠唤醒锁。如果想知道当前模块休眠唤醒失败是由哪个斥锁导致的,可以应用下面的命令实现:

awk '$6 !=0{print $1""$6}' /sys/kernel/debug/wakeup_sources

(3)Linux错误码:

错误代码由内核或用户空间应用程序(通过error变量)解释。错误处理在软件开发中非常重要,而不仅仅是在内核开发中。幸运的是,内核提供的几种错误,几乎涵盖了可能遇到的所有错误,有时需要把它们打印出来以帮助进行调试。

相应文件的路径:

include/uapi/asm-generic/errno-base.h
include/uapi/sm-generic/error.h

具体如下: 

相应所有错误码说明,可参考:

Linux错误代码及其含义_linux enxio_wsqyouth的博客-CSDN博客

(4)Linux kernel中计算代码运行时间:

对内核或驱动代码做性能优化时,常常要测量一段代码执行时所消耗的时间。

常用的函数为ktime_get(),在一段代码前后各使用 ktime_get() 获取时间,计算其差值,就是这段代码运行消耗的时间。ktime_get() 能够精确到纳秒级。

(5)debugfs

内核中有三个常用的伪文件系统: procfs, debugfs和sysfs。 

debugfs是内核开发中专门用来调试的文件系统接口,其他的工具或者接口,多数都依赖于debugfs。

具体如何使用,参考文章:

https://xuesong.blog.csdn.net/article/details/124112698

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

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

相关文章

推荐系统---AUC / NDGG

目录: ROC / AUC1:坐标含义(横坐标)FPR:伪阳性率,分类器 “分类错误的负样本个数” 占 “总负样本个数” 的比例。(纵坐标)TPR:真阳性率,分类器 “分类正确的…

centos 7.6 安装mysql 5.7.35

centos 7.6 安装mysql 5.7.35 1、下载mysql安装包2、安装文档3、安装MySQL包4、安装后形成的配置文件和程序位置5、安装后设置5.1、修改MySQL root账户默认密码5.2、关闭系统防火墙 6、使用mysql 5.7.35 数据库6.1、命令行登录MySQL 5.7.35 数据库6.2、navicat连接mysql 5.7.35…

酒精和肠内外健康:有帮助还是有害?

谷禾健康 酒精与健康 饮酒作为一种特殊的文化形式,在我们国家有其独特的地位,在几千年的发展中,酒几乎渗透到日常生活、社会经济、文化活动之中。 据2018年发表的《中国饮酒人群适量饮酒状况》白皮书数据显示,中国饮酒人群高达6亿…

MS5208数模转换器可pin对pin兼容DAC128S085

DAC128S085 是一款功能齐全的通用八通道 12 位电压输出数模转换器 (DAC),可采用 2.7V 至 5.5V 单电源供电,3V 时功耗为 1.95mW,5 V 时功耗为 4.85mW。DAC128S085 采用 16 引脚 WQFN 封装和 16 引脚 TSSOP 封装。WQFN 封…

Convolutional Neural network(卷积神经网络)

目录 Why CNN for Image? The whole CNN structure Convolution(卷积) Max Pooling Flatten CNN in Keras What does CNN learn? what does filter do what does neuron do what about output Deep Dream Application Pla…

数据库缓存服务——NoSQL之Redis配置与优化

一、缓存概念 缓存是为了调节速度不一致的两个或多个不同的物质的速度,在中间对速度较慢的一方起到加速作用,比如CPU的一级、二级缓存是保存了CPU最近经常访问的数据,内存是保存CPU经常访问硬盘的数据,而且硬盘也有大小不一的缓存…

测试用例的设计方法

目录 测试用例的设计方法 等价类: 等价类分为有效等价类与无效等价类 分类树 边界值: 语法测试 正面测试: 负面测试: 判定表测试 因果图: 场景法: 随机测试: 希望能起到帮助&#xf…

关于使用pyinstaller来打包PySide2程序中的问题

打包 pyinstaller 02.py --noconsole --hidden-import PySide2.QtXml 报错0:The ‘pathlib‘ package is an obsolete backport of a standard library package 分析:这个是因为笔者使用的conda的集成环境,这里面自带了打包程序&#xff0c…

Cocos creator小游戏实现套牛小游戏资源及代码

Cocos creator实现套牛小游戏资源及代码 一 安装CocosDashBoard二 新建2D项目RunCow1、管理项目目录2、搭建界面 三 上线微信小游戏1、上线微信小游戏2、Cocos Creator代码打包上传3、上线微信小游戏出现问题 Cocos creator小游戏实现套牛小游戏资源及代码 最近在学习Cocos Cre…

23案例P135-员工部门增删改查实现

一、准备工作 需要完成tlias的部门管理和员工管理 创建tlias数据库,导入 -- 部门管理 create table dept(id int unsigned primary key auto_increment comment 主键ID,name varchar(10) not null unique comment 部门名称,create_time datetime not null commen…

软件I2C读写MPU6050代码

1、硬件电路 SCL引到了STM32的PB10号引脚,SDA引到了PB11号引脚软件I2C协议: 用普通GPIO口,手动反转电平实现协议,不需要STM32内部的外设资源支持,故端口是可以任意指定MPU605在SCL和SDA自带了两个上拉电阻,…

漏刻有时地理信息系统说明文档(LOCKGIS、php后台管理、三端一体PC-H5-微信小程序、百度地图jsAPI二次开发、标注弹窗导航)

漏刻有时地理信息系统LOCKGIS 前言一、运行环境(一)环境检查(二)权限检查(三)函数支持(四)域名相关 二、核心代码(一)坐标展示(二)实时…

Excel快捷键大全(2023最新版总结)

案例:Excel快捷键大全 【作为一名打工人,我总是要用到Excel表格,大家平常在使用Excel时都有什么比较好用的快捷键推荐吗?】 Excel是一款功能强大的电子表格软件,可以用于数据管理、计算、分析和报表生成等多种任务。…

HDFS的数据流

1.HDFS写数据流程 (1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。 (2)NameNode返回是否可以上传。 (3)客户端…

Shell系统编程三剑客之----AWK

目录 1.AWK工具简介 2.AWK的基本格式 3.AWK工作原理 4.常见的内建变量(可直接用) 二: AWK实例 1.按行输出文本 2.按字段输出文本 3.通过管道、双引号调用 Shell 命令 4.date命令输出时间 5. 查看内存使用占比 6.查看cpu使用占比 7.…

【linux】shell编程—快捷命令

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、快捷排序 - sort二、快捷去重 - uniq三、快捷替换 - tr四、快速裁剪 - cut五、文件拆分 - split六、文件合并 - paste七、变量扫描器 - eval 一、快捷排序 - so…

5个良心好用的Windows神级软件,让你打开新世界的大门

今天再次推荐5个良心好用的Windows神级软件,每一个都是完全免费,堪称神器,让你打开新世界的大门。 1.PPT插件——OneKeyTools OK插件是一款免费的PPT插件,让你的PPT制作有无限可能!它的功能,太多了&#…

CoCo数据集-目标检测指标MAP

文章目录 一、前言二、评价指标的一些概念2.1.一些概念2.2.概念介绍2.3.MAP求解 三、理解CoCo的评价指标四、总结五、学习视频、Coco官方地址 一、前言 前面学习了coco数据集但是不知道它的评价指标,所以写下来作为自己的笔记,以后还是直接在这写好再保…

算法设计期末考试

算法设计期末考试 1.分治法3选11.1全排列1.2二分法--金块问题1.3子数组换位问题 2.贪心选2题2.1 活动安排2.2 活动安排(改)2.3 最优装载2.4 多机调度2.5 最优服务次序问题2.6 多处最优服务次序问题 3.动态规划选1-2题3.1最长公共子序列3.2最大子段和3.3 …

这个原因,让你自动化测试年薪30W+也不能躺平

其实这个问题,我们遇到到很多次: “自动化就可以满足我现在的公司需求,为什么不躺平,还要继续学测开?” 每次遇到这个问题后,立马就会有一个“涨薪效应”:收到粉丝们的高薪offer ​ 其实&#x…