Linux驱动调试方法(高级字符设备八)

news2024/11/25 7:21:35

  在编写Linux驱动程序时,通常都使用 printk 函数打印相应的提示信息从而对驱动进行调试,除了printk 函数之外,还有其他的方式来调试驱动呢。

一、dump_stack 函数

  作用:打印内核调用堆栈,并打印函数的调用关系。
这里以最简单的 helloworld 驱动为例进行 dump_stack 函数演示,实验代码如下所示:

#include <linux/module.h>
#include <linux/kernel.h>
static int __init helloworld_init(void)
{
    printk(KERN_EMERG "helloworld_init\r\n");
    dump_stack();
    return 0;
}
static void __exit helloworld_exit(void)
{
    printk(KERN_EMERG "helloworld_exit\r\n");
}
module_init(helloworld_init);
module_exit(helloworld_exit);

  驱动加载之后打印信息如下所示:
在这里插入图片描述
  可以看到 helloworld_init 函数的调用关系就都打印了出来。

二、WARN_ON(condition)函数

  WARN_ON (condition)函数作用:在括号中的条件成立时,内核会抛出栈回溯,打印函数的调用关系。通常用于内核抛出一个警告,暗示某种不太合理的事情发生了。
  WARN_ON 实际上也是调用 dump_stack,只是多了参数condition 判断条件是否成立,例如 WARN_ON (1)则条件判断成功,函数会成功执行。
  这里仍然以最简单的 helloworld 驱动为例进行 WARN_ON 函数演示,代码如下所示:

#include <linux/module.h>
#include <linux/kernel.h>
static int __init helloworld_init(void)
{
    printk(KERN_EMERG "helloworld_init\r\n");
    WARN_ON(1);
    return 0;
}
static void __exit helloworld_exit(void)
{
    printk(KERN_EMERG "helloworld_exit\r\n");
}
module_init(helloworld_init);
module_exit(helloworld_exit);

  驱动加载之后打印信息
在这里插入图片描述
  可以看到 helloworld_init 函数的调用关系以及寄存器值就都打印了出来。

三、BUG_ON (condition)函数

  内核中有许多地方调用类似 BUG_ON()的语句,它非常像一个内核运行时的断言,意味着本来不该执行到 BUG_ON()这条语句,一旦 BUG_ON()执行内核就会立刻抛出oops,导致栈的回溯和错误信息的打印。大部分体系结构把 BUG()和 BUG_ON()定义成某种非法操作,这样自然会产生需要的 oops。参数 condition 判断条件是否成立,例如BUG_ON(1)则条件判断成功,函数会成功执行。
  这里仍然以最简单的 helloworld 驱动为例进行 BUGON 函数演示,实验代码如下所示:

#include <linux/module.h>
#include <linux/kernel.h>
static int __init helloworld_init(void)
{
    printk(KERN_EMERG "helloworld_init\r\n");
    BUGON(1);
    return 0;
}
static void __exit helloworld_exit(void)
{
    printk(KERN_EMERG "helloworld_exit\r\n");
}
module_init(helloworld_init);
module_exit(helloworld_exit);

  驱动加载之后打印信息如下
在这里插入图片描述
  可以看到 helloworld_init 函数的调用关系以及寄存器值就都打印了出来。

四、panic (fmt…)函数

  panic (fmt…)函数:输出打印会造成系统死机并将函数的调用关系以及寄存器值就都打印了出来。

#include <linux/module.h>
#include <linux/kernel.h>
static int __init helloworld_init(void)
{
    printk(KERN_EMERG "helloworld_init\r\n");
    panic("!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
    return 0;
}
static void __exit helloworld_exit(void)
{
    printk(KERN_EMERG "helloworld_exit\r\n");
}
module_init(helloworld_init);
module_exit(helloworld_exit);

  驱动加载之后打印信息如下
在这里插入图片描述
  可以看到 helloworld_init 函数的调用关系以及寄存器值就都打印了出来,信息打印完成之后会发现系统已经崩溃了,终端已经无法再进行输入。

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

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

相关文章

传奇黑客斯诺登,现状如何了?

曾经曝光米国棱镜计划的英雄斯诺登&#xff0c;现在怎么样了&#xff1f; 要说老米最恨的人有哪些&#xff0c;那斯诺登肯定榜上有名。斯诺登曾经是一名军人&#xff0c;退伍后在中情局负责维持网络安全&#xff0c;在得知老米的棱镜计划之后&#xff0c;出于人道主义&#xff…

面试题之JavaScript经典for循环(var let)

如果你也在面试找工作&#xff0c;那么也一定遇到过这道for循环打印结果的题&#xff0c;下面我们来探讨下 var循环 for(var i 0; i < 10; i) {setTimeout(function(){console.log(i)}); } 先把答案写出来 下面来讲一下原因&#xff1a; 划重点 ① var ②setTimeout() …

发卡系统微信小程序源码/云盘发卡系统源码带PC端/自动发卡小程序源码(开源)

源码介绍&#xff1a; 最新开源的发卡系统微信小程序源码&#xff0c;这是一款云盘发卡系统源码&#xff0c;还带了电脑PC端。它是一款实用方便操作自动发卡小程序源码&#xff0c;它使用ERMEB云盘发卡&#xff0c;能为用户提供便捷的发卡服务。 源码框架&#xff1a; 系统采…

Unity的碰撞检测(四)

温馨提示&#xff1a;本文基于前一篇“Unity的碰撞检测(三)”继续探讨两个游戏对象具备刚体的触发检测&#xff0c;阅读本文则默认已阅读前文。 &#xff08;一&#xff09;测试说明 在基于两个游戏对象都具备触发器和刚体且属性一致的条件下&#xff0c;若二者刚体的BodyType…

CTF-php特性绕过

注意&#xff1a;null0 正确 nullflase 错误 Extract变量覆盖 <?php$flagxxx; extract($_GET);if(isset($shiyan)){ $contenttrim(file_get_contents($flag));//trim移除引号if($shiyan$content){ echoctf{xxx}; }else{ echoOh.no;} }?> extract() 函数从数组中将…

java中Map常见的面试问题,扩容问题,转红黑树的前提,解决Hash哈希冲突的方法

Map集合常见面试题 如何解决 解决哈希碰撞的方法 1链地址法(hashMap的处理方式) 把hash表的每个单元作为链表的头节点。当发生冲突时放入到同一个hash值计算索引对应的链表。 2开放定址法 发生冲突后寻找下一个地址 3再次hash法 对hash值再次进行hash计算 4建立公共溢出区…

【Linux】进程地址空间、进程的概念、进程的描述、物理地址空间、进程地址空间和物理地址空间的关系

文章目录 1.进程的概念1.1进程是什么 2.进程的描述2.1进程的组成2.2task_struct的内容 3.进程地址空间&#xff08;虚拟地址空间&#xff09;3.1物理地址空间3.2进程地址空间和物理地址空间的关系 1.进程的概念 1.1进程是什么 从计算机的硬件到软件和用户需要有很多的交互&…

win11安装docekr、docker-compose

1.docker安装 下载地址&#xff1a;Install Docker Desktop on Windows | Docker Docs 出问题别慌&#xff0c;看清楚提示信息&#xff0c;cmd更新wsl&#xff0c;什么是wsl&#xff0c;百度好好理解一下哦 2.docker-compose安装 还是去官方看看怎么说的&#xff0c;然后跟着处…

面向边缘场景的 PWA 实践

背景 随着5G技术的发展&#xff0c;物联网边缘侧主要应用于数据传输量大、安全要求高以及数据实时处理等行业与应用场景中。其中&#xff0c;边缘计算是一种分布式计算模式&#xff0c;其将计算资源和数据处理能力推向接近数据源的边缘设备&#xff0c;以减少延迟并提高响应速度…

设计模式:中介者模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

上一篇《迭代器模式》 下一篇《备忘录模式》 简介&#xff1a; 中介者模式&#xff0c;它是是一种行为设计模式&#xff0c;它允许将一组对象之间的交互封装到一个单独的类中&#xff0c;从而降低对象之间的耦合性…

KF-GINS 和 OB-GINS 的 Earth类 和 Rotation 类

原始 Markdown文档、Visio流程图、XMind思维导图见&#xff1a;https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 一、Earth 类&#xff1a;地球参数和坐标转换1、gravity()&#xff1a;正常重力计算2、meridianPrimeVerticalRadius()&#xff1a;计算子午圈半径…

04 文件管理

文件管理 文件和目录的创建 删除文件和目录 文件查找命令 文件的拷贝和移动 打包和压缩

MySQL -- 表的约束

MySQL – 表的约束 文章目录 MySQL -- 表的约束一、表的约束1.空属性2.默认值3.列描述4.zerofill5.主键6.自增长7.唯一键8.外键 一、表的约束 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合 法…

使用Selenium和Java编写爬虫程序

以下是一个使用Selenium和Java编写的音频爬虫程序&#xff0c;该程序使用了proxy的代码。请注意&#xff0c;这个示例需要在IDE中运行&#xff0c;并且可能需要根据您的系统和需求进行调整。 import java.io.IOException; import java.util.List; import java.util.concurrent…

PYTHON快捷键合集!学会让你成为大一最靓的仔

前言 大家好&#xff0c;我是艾登&#xff0c;一个始于JAVA终于PYTHON的老程序员&#xff0c;学习代码固然重要&#xff0c;但是在职场上能够知道打代码的各种快捷键的手法能够让你事半功倍&#xff0c;现在就由我来向大家介绍一下python各种快捷键的用法。 如果觉得对你有帮助…

机器学习(python)笔记整理

目录 一、数据预处理&#xff1a; 1. 缺失值处理&#xff1a; 2. 重复值处理&#xff1a; 3. 数据类型&#xff1a; 二、特征工程: 1. 规范化&#xff1a; 2. 归一化&#xff1a; 3. 标准化(方差)&#xff1a; 三、训练模型&#xff1a; 如何计算精确度&#xff0c;召…

浅谈IIC总线通信协议

IIC IIC&#xff1a;集成电路总线(Inter-Integrated Circuit) 快速&#xff1a;400kbit/s 高速&#xff1a;3.4Mbit/s 速度由 SCL 决定&#xff0c;上升沿斜率受上拉电阻和等效电容影响。 物理层 两线式串行总线&#xff0c;可发送和接收数据。 数据线&#xff1a;SDA 时钟线…

栈和队列(2)

目录 &#x1f341;一、链表的概念 &#x1f341;二、针对本文章给出的几点注意事项&#xff1a; &#x1f341;三、队列的实现 &#x1f315;&#xff08;一&#xff09;、代码定义 注意&#xff1a; &#x1f315;&#xff08;二&#xff09;、初始化 &#x1f315;&am…

java.java.lang.NoSuchMethodError: org.bouncycastle.math.ec.ECFieldElement

目录 Java运行时异常:行时找不到指定的方法 1.前言2.原因2.1项目中的版本有冲突2.2项目中某个包缺少bouncycastle依赖 总结参考 1.前言 java.lang.NoSuchMethodError: org.bouncycastle.math.ec.ECFieldElement$Fp.(Ljava/math/BigInteger;Ljava/math/BigInteger;) java.lang…

(PC+WAP)照明科技类网站模板 LED灯具照明网站源码下载

(PCWAP)照明科技类网站模板 LED灯具照明网站源码下载 PbootCMS内核开发的网站模板&#xff0c;该模板适用于照明科技网站、灯具照明网站等企业&#xff0c;当然其他行业也可以做&#xff0c;只需要把文字图片换成其他行业的即可&#xff1b; pcwap&#xff0c;同一个后台&#…