当前位置: 首页 > 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;数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 用户功能…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

Java后端检查空条件查询

通过抛出运行异常&#xff1a;throw new RuntimeException("请输入查询条件&#xff01;");BranchWarehouseServiceImpl.java // 查询试剂交易&#xff08;入库/出库&#xff09;记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...

STM32标准库-ADC数模转换器

文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”&#xff1a;输入模块&#xff08;GPIO、温度、V_REFINT&#xff09;1.4.2 信号 “调度站”&#xff1a;多路开关1.4.3 信号 “加工厂”&#xff1a;ADC 转换器&#xff08;规则组 注入…...