【Linux】驱动内核调试,没有几板斧,怎么能行?

news2025/1/18 7:23:05

目录

前言:

一、基础打印工具

 (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/523786.html

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

相关文章

C语言实战 - 贪吃蛇(图形界面)

由于本人精力有限,暂时先把素材和代码放上,等以后有空再补教程。 目录 效果预览 准备工作 EasyX图形库 音频素材 代码编写 Transfer.h文件 game.cpp文件 main.c文件 效果预览 先来看一下最终成品效果 贪吃蛇图形界面 准备工作 EasyX图形库 这…

[230513] TPO72 | 2022年托福阅读真题第1/36篇 | 10:45

Invading Algae 目录 Invading Algae 全文 题目 Paragraph 1 P1 段落大意 问题1 Paragraph 2 P2 段落大意 问题2 *问题3* Paragraph 3 P3 段落大意 问题4 Paragraph 4 P4 段落大意 Paragraph 5 P5 段落大意 *问题5* *问题6* 问题7 问题8 问题9…

【计算机组成原理】第二章 运算方法和运算器

系列文章目录 第一章 计算系统概论 第二章 运算方法和运算器 第三章 多层次的存储器 第四章 指令系统 第五章 中央处理器 第六章 总线系统 第七章 外围设备 第八章 输入输出系统 文章目录 系列文章目录第一章 计算系统概论 **第二章 运算方法和运算器** 第三章 多层次的存储器…

C++移动构造函数

一、背景 拷贝构造函数又分为浅拷贝和深拷贝: 浅拷贝:当类中有指针时,直接复制,会使多个指针指向同一块内存,导致重复析构 深拷贝:每次都是重新赋值一份,这种方法内存消耗较大 因此C就提供…

一觉醒来Chat gpt就被淘汰了

目录 什么是Auto GPT? 与其他语言生成模型相比,Auto GPT具有以下优点 Auto GPT的能力 Auto GPT的能力非常强大,它可以应用于各种文本生成场景,包括但不限于以下几个方面 Auto GPT的历史 马斯克说:“ChatGPT 好得吓…

【C++从0到王者】第三站:类和对象(中)赋值运算符重载

文章目录 一、运算符重载1.运算符重载的使用2.运算符重载的注意事项 二、赋值运算符重载1.复制拷贝与拷贝构造2.赋值运算符重载的格式3.赋值运算符重载的实现4.赋值运算符重载的注意事项 一、运算符重载 1.运算符重载的使用 当我们实现一个日期类的时候,我们有时候…

一个*泰NL18-20漏电保护器的拆解

一个*泰NL18-20漏电保护器的拆解,购买很早了,损坏,按test按钮无动作,昨天用一个雷*的63A漏保替换了。 NL18-20的电流只有20A。显然不适合现在的运用了。而且是无灭弧装置,所以分断能力有限。 好奇,拆开来看…

C++PrimerPlus第四章编程题

编程题 题目总览 编程题题解 题目要求输入四次信息,有四次交互的输入(in),最后在一口气列举出来。同时对于firstname与lastname进行了拼接,而且对于输入的成绩进行降级操作。同时对于名字name的要求是可以输入多个单词…

使用Flink MySQL cdc分别sink到ES、Kafka、Hudi

环境说明 [flink-1.13.1-bin-scala_2.11.tgz](https://archive.apache.org/dist/flink/flink-1.13.1/flink-1.13.1-bin-scala_2.11.tgz)[hadoop-2.7.3.tar.gz](https://archive.apache.org/dist/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz)[flink-cdc-connectors](https:…

【Base64】前后端图片交互(2)

使用Base64去处理前后端图片交互 一、Base64编码介绍二、java.util.Base64 介绍源码分析编码译码 三、使用 Base64 前后端图片交互(实操)四、效果展示五、总结 绪论:在此之前小编发过一次前后端交互处理的方式:前后端图片交互的简…

深度学习之图像分类(三):VGGNet

系列文章目录 本专栏介绍基于深度学习进行图像识别的经典和前沿模型,将持续更新,包括不仅限于:AlexNet, ZFNet,VGG,GoogLeNet,ResNet,DenseNet,SENet,Mobile…

Windows磁盘空间不够,发现DriverStore文件夹特别大

正想安装一个新的VS2022,但是发现C盘的空间已经不足, 显示为红色了,这样不能安装。只好找一下C盘的空间为什么不足了,后来发现有一个目录特别大,这个目录就是DriverStore文件夹。由于电脑已经运行5年了,也…

Java的线程

介绍线程 线程是系统调度的最小单元,一个进程可以包含多个线程,线程是负责执行二进制指令的。 每个线程有自己的程序计数器、栈(Stack)、寄存器(Register)、本地存储(Thread Local&#xff09…

Linux的基本权限

基本权限 1.权限的概念2.Linux上的用户分类2.1. 如何切换用户? 3.Linux的权限管理3.1. 文件访问者的分类(人)3.2.文件类型和访问权限(文件属性)3.2.1. 文件类型3.2.2. 基本权限 3.3. 文件权限值的表示方法3.3.1. 字符表…

Mac中idea快捷键(Keymap->macOS)

背景: mac:MacBook Pro(13英寸,M2,2022年) 系统版本:12.4 idea快捷键配置:本文快捷键设置基于macOS(Keymap->macOS) 一、常用快捷键 1.commandF 在当前…

java类和对象2

文章目录 一、Java实例变量和类变量二、Java实例方法和类方法三、Java方法重载四、Java this关键字五、Java包六、Java import语句七、Java访问权限八、Java基本类型的类封装九、Java jar文件总结 一、Java实例变量和类变量 实例变量和类变量的定义 在声明成员变量时&#xf…

微信云开发之云函数小例子

环境 微信开发者工具 Stable 1.06.2303220云开发控制台 v1.5.47 概述 云函数即在云端(服务器端)运行的函数,代码运行在云端Node.js中。我们可以使用云函数SDK中提供的数据库和存储API进行数据库和存储的操作。 云函数的独特优势在于与微信…

centos,搭建ftp服务;vsftpd

安装vsftpd 使用yum安装vsftpd: yum install -y vsftpd 配置vsftpd 编辑vsftpd配置文件: vim /etc/vsftpd/vsftpd.conf 以下是一些常见的配置项: anonymous_enableNO local_enableYES write_enableYES local_umask022 dirmessage_enableYE…

职场新人必备:10个写进备忘录的职场tips

作为职场新人,如何快速适应、获得成长和提升自己,是每个人都面临的挑战。在这个竞争激烈的职场中,拥有一些实用的职场tips,可以帮助你更好地应对各种挑战,获得成功。在本文中,我们将分享10个写进备忘录的职…

es8388 驱动详解

音频的基本框架 分为三个部分: 1) 整体的绿框,为machine,例如你的PC等,负责图中 “线”的部分的关联,及黄色连接器的管理。也就是说不属于 paltform和codec管理的部分,都划归machine管理。 对应…