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

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...