当前位置: 首页 > news >正文

Linux驱动开发常用调试方法汇总

引言:在 Linux 驱动开发中,调试是一个至关重要的环节。开发者需要了解多种调试方法,以便能够快速定位和解决问题。

1.利用printk

描述: printk 是 Linux 内核中的一个调试输出函数,类似于用户空间中的 printf。它用于在内核日志中输出调试信息,可以帮助开发者追踪内核代码的执行过程。

使用场景

  • 监控函数调用和变量值。
  • 追踪内核模块的加载和卸载过程。

example:

printk(KERN_INFO "Hello from my driver!");  // 输出信息到内核日志

查看日志: 使用 dmesg 命令或查看 /var/log/kern.log 文件可以查看 printk 输出的日志信息。

不同的SDK平台也有对于打印函数的重写,可以grep多找找。

2. OOP (Out of Process) 消息

描述: OOP 消息是指通过 dmesg 或系统日志查看内核在运行时产生的错误或调试信息,特别是与硬件设备交互时的错误消息。

使用场景

  • 诊断硬件错误。
  • 调试驱动程序的问题。

特点:OOP 消息中包含了出错时的调用栈和相关的内存信息,便于定位问题。

处理方式:如果遇到 OOP 消息,首先要分析调用栈,找出出错的函数和行号。

example:

OOP 消息通常出现在内核遇到错误时。例如,如果你的驱动程序访问了错误的内存地址,内核会在 dmesg 中显示相关的错误信息。

// 假设有个错误的指针使用
int *ptr = NULL;
*ptr = 10;  // 会导致内核崩溃

查看错误

dmesg | grep -i "error"  # 查看内核中的错误消息

3. straceltrace

strace

描述:strace 是一个强大的调试工具,用于跟踪用户空间程序执行时的系统调用和信号。

使用场景:可以帮助开发者了解驱动与用户空间程序之间的交互,特别是在系统调用返回错误时。

示例:使用 strace 跟踪一个程序:

strace -e trace=file ./my_program  # 只跟踪与文件相关的系统调用

ltrace:

描述:ltrace 类似于 strace,但它用于跟踪程序执行时的库函数调用。

使用场景:可以帮助开发者了解用户空间程序如何与库交互,以及调用了哪些驱动程序的接口。

ltrace ./my_program  # 跟踪库函数调用

相比之下你想跟踪用户程序调用的库函数就ltrace

你想跟踪系统调用,包括打开文件、读取、写入等 就用strace

4. 内核内置的 Hacking 选项

描述: Linux 内核提供了一些调试选项,通常通过内核配置选项开启,如 CONFIG_DEBUG_KERNEL、CONFIG_DEBUG_INFO 等。这些选项可以在内核编译时启用,以便于调试和分析。

使用场景

开启内核的内存调试和错误检查。

监测和调试系统资源使用情况。

示例: 在内核配置中启用调试选项后,编译和安装新内核。

example:

  • 进入内核源代码目录。
  • 运行 make menuconfig
  • 选择 "Kernel hacking",然后启用相关选项,如 "Kernel debugging"。
make
make modules_install
make install

5. ioctl 方法

描述: ioctl 是一种用于控制设备的系统调用,允许用户空间与内核之间进行复杂的交互。

使用场景

通过 ioctl 向内核传递命令和参数,控制设备行为或获取设备状态。

示例: 在驱动中实现 ioctl 接口,用户空间通过 ioctl 调用与驱动进行交互。

example:在驱动中实现 ioctl 接口。

#include <linux/fs.h>
#include <linux/uaccess.h>#define IOCTL_SET_VALUE  _IOW('a', 'a', int32_t*)static long my_ioctl(struct file *file, unsigned int cmd, unsigned long arg) {int32_t value;switch(cmd) {case IOCTL_SET_VALUE:copy_from_user(&value, (int32_t*)arg, sizeof(value));printk(KERN_INFO "Value set to %d\n", value);break;default:return -EINVAL;}return 0;
}

用户空间调用:

int fd = open("/dev/my_device", O_RDWR);
int32_t value = 10;
ioctl(fd, IOCTL_SET_VALUE, &value);
close(fd);

6. /proc 文件系统

描述: /proc 是一个虚拟文件系统,提供内核和系统的信息。通过在 /proc 下创建文件,驱动程序可以提供对内核状态和参数的访问。

使用场景

通过 /proc 文件与用户空间进行简单的交互,获取或设置驱动的状态。

示例: 在驱动中创建 /proc/my_driver 文件,用户空间可以读取或写入该文件来控制驱动。

#include <linux/proc_fs.h>
#include <linux/uaccess.h>#define PROC_NAME "my_proc"static ssize_t my_proc_read(struct file *file, char __user *buf, size_t count, loff_t *offset) {return sprintf(buf, "Hello from /proc/my_proc\n");
}static struct proc_ops my_proc_ops = {.proc_read = my_proc_read,
};static int __init my_driver_init(void) {proc_create(PROC_NAME, 0, NULL, &my_proc_ops);return 0;
}static void __exit my_driver_exit(void) {remove_proc_entry(PROC_NAME, NULL);
}module_init(my_driver_init);
module_exit(my_driver_exit);

查看内容:

cat /proc/my_proc  # 查看 /proc 文件内容

7. kgdb

描述: kgdb 是 Linux 内核调试器,允许开发者在内核态中进行单步调试、设置断点等。

使用场景

用于调试内核模块和驱动程序,特别是在出现严重错误时。

示例: 通过配置内核选项启用 kgdb,然后使用 GDB 进行调试:

  • 确保在内核配置中启用了 CONFIG_KGDBCONFIG_KGDB_SERIAL_CONSOLE
  • 启动内核时,传递 kgdboc=ttyS0,115200 参数,指定串行控制台。
gdb vmlinux
(gdb) target remote /dev/ttyS0  # 连接到内核

相关文章:

Linux驱动开发常用调试方法汇总

引言&#xff1a;在 Linux 驱动开发中&#xff0c;调试是一个至关重要的环节。开发者需要了解多种调试方法&#xff0c;以便能够快速定位和解决问题。 1.利用printk 描述&#xff1a; printk 是 Linux 内核中的一个调试输出函数&#xff0c;类似于用户空间中的 printf。它用于…...

将列表中的各字符串sn连接成为一个字符串s使用;将各sn间隔开os.pathsep.join()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 将列表中的各字符串sn 连接成为一个字符串s 使用;将各sn间隔开 os.pathsep.join() [太阳]选择题 下列说法中正确的是? import os paths ["/a", "/b/c", "/d&q…...

算法题总结(八)——字符串

531、反转字符串二 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个&#xff0c…...

大数据开发--1.2 Linux介绍及虚拟机网络配置

目录 一. 计算机入门知识介绍 软件和硬件的概述 硬件 软件 操作系统概述 简单介绍 常见的系统操作 学习Linux系统 二. Linux系统介绍 简单介绍 发行版介绍 常用的发行版 三. Linux系统的安装和体验 Linux系统的安装 介绍 虚拟机原理 常见的虚拟机软件 体验Li…...

2024CSP-J复赛易错点

低级错误 不开long long见祖宗写代码要有输入&#xff0c;别没写输入就交写完代码要在本地测试&#xff0c;多想写极端测试数据&#xff0c;或对拍注意考官说文件夹怎么建&#xff0c;别文件夹建错&#xff0c;爆0别忘写freopen或忘给freopen去注释记着把.exe文件删掉考试时不…...

pytorch 与 pytorch lightning, pytorch geometric 各个版本之间的关系

主要参考 官方的给出的意见&#xff1b; 1. pytorch 与 pytorch lightning 各个版本之间的关系 lightning 主要可以 适配多个版本的 torch; https://lightning.ai/docs/pytorch/latest/versioning.html#compatibility-matrix&#xff1b; 2. pytorch 与 pytorch geometric 各…...

Spring Boot项目的创建与使用

1.通过IDE创建Spring Boot项目 2.目录结构 3.新建TestController控制器 Controller public class TestController {RequestMapping("/test")public ModelAndView test(RequestParam(name "name", defaultValue "刘德华") String name){ModelA…...

pytorch常用函数view、sum、sequeeze、cat和chunk

文章目录 view()函数sequeeze和unsequeezecat和chunk函数sum函数view()函数 view()相当于reshape、resize,重新调整Tensor的形状。 指定调整形状之后的维度import torch re = torch.tensor([1, 2, 3, 4, 5...

【STM32开发之寄存器版】(四)-独立看门狗IWDG

一 、前言 独立看门狗简介&#xff1a; STM32F103ZET6内置两个看门狗&#xff0c;提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障。 独立看门狗主要性能&#xff1a; 自由运行的递减计数器时钟…...

【S32K3 RTD MCAL 篇1】 K344 KEY 控制 EMIOS PWM

【S32K3 RTD MCAL 篇1】 K344 KEY 控制 EMIOS PWM 一&#xff0c;文档简介二&#xff0c; 功能实现2.1 软硬件平台2.2 软件控制流程2.3 资源分配概览2.4 EB 配置2.4.1 Dio module2.4.2 Icu module2.4.4 Mcu module2.4.5 Platform module2.4.6 Port module2.4.7 Pwm module 2.5 …...

华为OD机试真题---绘图机器(计算面积)

题目描述 绘图机器的绘图笔初始位置在原点(0,0)&#xff0c;机器启动后按照以下规则绘制直线&#xff1a; 尝试沿着横线坐标正向绘制直线直到给定的终点E。期间可以通过指令在纵坐标轴方向进行偏移&#xff0c;offsetY为正数表示正向偏移&#xff0c;为负数表示负向偏移。 给…...

HarmonyOs 查看官方文档使用弹窗

1. 学会查看官方文档 HarmonyOS跟上网上的视频学习一段时间后&#xff0c;基本也就入门了&#xff0c;但是有一些操作网上没有找到合适教学的视频&#xff0c;这时&#xff0c;大家就需要养成参考官方文档的习惯了&#xff0c;因为官方的开发文档是我们学习深度任何一门语言或…...

uniapp+Android智慧居家养老服务平台 0fjae微信小程序

目录 项目介绍支持以下技术栈&#xff1a;具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是&#xff1a;数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 老年人 登…...

在一台电脑上实现网页与exe程序使用udp通信

要在同一台电脑上实现网页&#xff08;前端&#xff09;与 EXE 程序&#xff08;后端&#xff09;通过 UDP 通信&#xff0c;可以使用以下步骤。前端可以使用 JavaScript 通过 WebSocket 与自定义服务器进行通信&#xff0c;该服务器通过 UDP 发送和接收数据&#xff0c;再与 E…...

基于Java的GeoTools对Shapefile文件属性信息深度解析

目录 前言 一、Shapefile的属性列表信息 1、属性表格信息 2、属性表格包含的要素 二、GeoTools对属性表格的解析 1、常规解析方法 2、基于dbf文件的属性信息读取 三、总结 前言 ESRI Shapefile&#xff08;shp&#xff09;&#xff0c;或简称shapefile&#xff0c;是美…...

付费计量系统实体和接口(1)

13.System entities and interfaces 系统实体和接口 See also Clause 4 for a discussion on general concepts and Clause 5 for generic entity model. 参见条目 4 讨论总体概念、条目 5 通用实体模型。 An entity specification should specify the embodied functions and …...

网易博客旧文----bacnet学习系列之四----VTS的初步使用

bacnet学习系列之四----VTS的初步使用 2014-02-07 13:32:28| 分类&#xff1a; BACnet | 标签&#xff1a; |举报 |字号大中小 订阅 这是一个测试用 的工具&#xff0c;而且是开放源码的&#xff0c;下载地址为&#xff1a;VTS下载官网 也可以从我的网盘下载 VTS下载 我用的是…...

SpringIoC容器的初识

一、SpringIoC容器的介绍 Spring IoC 容器&#xff0c;负责实例化、配置和组装 bean&#xff08;组件&#xff09;。容器通过读取配置元数据来获取有关要实例化、配置和组装组件的指令。配置元数据以 XML、Java 注解或 Java 代码形式表现。它允许表达组成应用程序的组件以及这…...

队列的实现与讲解

一.概念与结构 1.概念 只允许在⼀端进行插⼊数据操作&#xff0c;在另⼀端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) ​ 入队列&#xff1a;进⾏插⼊操作的⼀端称为队尾 ​ 出队列&#xff1a;进⾏删除操作的⼀端称为队头 注意&…...

hbuilderx+uniapp+Android健身房管理系统 微信小程序z488g

目录 项目介绍支持以下技术栈&#xff1a;具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是&#xff1a;数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 用户功能…...

自动驾驶-参考线生成

为什么要进行参考线生成&#xff1f; apollo在routing模块&#xff0c;已经得到的全局路径&#xff0c;但是其不能直接作为局部路径规划的参考线&#xff0c;这是因为&#xff1a; routing给出的全局路径过长&#xff1b;routing是基于高精地图给出的路径&#xff0c;高精地图…...

厂商资源分享网站

新华三&#xff08;H3C&#xff09;是一家中国知名的网络设备供应商&#xff0c;提供网络设备、网络解决方案和云计算服务。公司成立于2003年&#xff0c;是华为公司和惠普公司合资的企业&#xff0c;总部位于中国深圳。 华为&#xff08;Huawei&#xff09;是一家全球知名的电…...

【ONE·Web || HTML】

总言 主要内容&#xff1a;HTML基本知识入门&#xff0c;主要介绍了常见的一些标签使用&#xff0c;以及简单案例演示。       文章目录 总言0、前置说明1、认识HTML1.1、是什么1.2、初识 HTML 标签、HTML 文件基本结构1.2.1、相关说明1.2.2、vscode如何快速生成代码 2、HT…...

MongoDB的安装与增删改查基本操作

MongoDB是一种非关系型数据库,是NoSQL语言,但是又是最接近关系型数据库的。内部存储不是表结构,但是可以对数据进行表结构的操作。 一、安装 在官网:Download MongoDB Community Server | MongoDB下载系统对应的版本进行安装即可 二、编辑器 在安装MongoDB后会自带一个编…...

Python水循环标准化对比算法实现

&#x1f3af;要点 算法区分不同水循环数据类型&#xff1a;地下水、河水、降水、气温和其他&#xff0c;并使用相应标准化降水指数、标准化地下水指数、标准化河流水位指数和标准化降水蒸散指数。绘制和计算特定的时间序列比较统计学相关性。使用相关矩阵可视化集水区和显示空…...

【TypeScript】知识点梳理(一)

#国庆快乐&#xff01;来点干货~ # #项目中团队总结生产问题&#xff0c;40%是类型相关问题&#xff0c;可见TS的重要性与向好趋势# TS是JS的超集 类型 Number、String、Boolean 首字母大小写&#xff0c;类型有区别&#xff0c;譬如&#xff1a; string是基元&#xff08;原始…...

DMA方式在执行中断处理程序时不中断现行程序吗

DMA方式在执行中断处理程序时会中断现行程序&#xff0c;但DMA数据传输过程本身不中断现行程序。以下是对DMA方式及其中断处理程序的详细解释&#xff1a; DMA方式的基本特点 DMA&#xff08;Direct Memory Access&#xff0c;直接存储器存取&#xff09;方式是一种由硬件直接…...

Redis:string类型

Redis&#xff1a;string类型 string命令设置与读取SETGETMSETMGET 数字操作INCRINCRBYDECRDECRBYINCRBYFLOAT 字符串操作APPENDSTRLENGETRANGESETRANGE 内部编码intembstrraw 在Redis中&#xff0c;字符串string存储的是二进制&#xff0c;以byte为单位&#xff0c;输入的二进…...

【C++ STL】手撕vector,深入理解vector的底层

vector的模拟实现 前言一.默认成员函数1.1常用的构造函数1.1.1默认构造函数1.1.2 n个 val值的构造函数1.1.3 迭代器区间构造1.1.4 initializer_list 的构造 1.2析构函数1.3拷贝构造函数1.4赋值运算符重载 二.元素的插入,删除,查找操作2.1 operator[]重载函数2.2 push_back函数:…...

【Android】CarWatchDog I/O监控服务

Android Car WatchDog I/O监控服务 背景&#xff1a; 某基于Android 13的车载系统。 某天长时间测试一款3方&#xff08;非SystemApp&#xff09;时&#xff0c;该款应用偶发闪退现象。 通过日志分析&#xff0c;发现应用被系统的 Car WatchDog&#xff08;喂狗服务&#xff…...