首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux设备驱动第四篇:linux驱动调试方法

普通的c应用程序中,我们经常使用printf来输出信息,或者使用gdb来调试程序,那么驱动程序如何调试呢?...我们知道调试程序时经常遇到的问题就是野指针或者数组越界带来的问题,应用程序中运行这种程序就会报segmentation fault的错误,而由于驱动程序的特殊性,出现此类情况后往往会直接造成系统宕机...下面就根据一个简单的实例来说明如何调试驱动程序。...如何根据oops定位代码行 我们借用linux设备驱动第二篇:构造和运行模块里面的hello world程序来演示出错的情况,含有错误代码的hello world如下: #include <linux/...printk的使用方法类似printf,只是要注意一下打印级别,详细介绍linux设备驱动第二篇:构造和运行模块中已有描述,另外需要注意的是大量使用printk会严重拖慢系统,所以使用过程中也要注意。

10.3K171

38.Linux驱动调试-根据系统时钟定位出错位置

当内核或驱动出现僵死bug,导致系统无法正常运行,怎么找到是哪个函数的位置导致的?...答,通过内核的系统时钟,因为它是由定时器中断产生的,每隔一定时间便会触发一次,所以当CPU一直某个进程中时,我们便在中断函数中打印该进程的信息 1.先来回忆下 之前的第5章内核中断运行过程:分析过...因为此时的PC是返回地址,而PC-4才是CPU运行的地址) 3.首先来找到系统时钟的中断号irq 输入#cat /proc/interrupt,如下图所示: 其中中断号来自 linux-2.6.22.6...号 current->com:表示当前进程的name 2) HZ也是一个宏,代表每S的频率,比如每隔10ms加1,那么HZ就等于100 5.测试运行 接下来,我们便安装一个带有while(1)死循环的驱动...,然后通过测试程序,内核便会一直while(1)死循环,进入僵死状态。

1.7K100
您找到你想要的搜索结果了吗?
是的
没有找到

Linux设备驱动程序(四)——调试技术

CONFIG_DEBUG_DRIVER “Device drivers(设备驱动程序)”菜单中。该选项打开驱动程序核心中的调试信息,它可以帮助跟踪底层支持代码中的问题。...很多驱动程序启动的时候以这个级别来打印出它们找到的硬件信息。 KERN_DEBUG 用于调试信息。 每个字符串(以宏的形式展开)表示一个括号中的整数。...驱动程序开发人员可以用如下方法对系统进行查询:proc 文件系统中创建文件、使用驱动程序的 ioctl 方法,以及通过 sysfs 导出属性等。... Linux 系统中对 /proc 的使用很频繁。现代 Linux 发行版中的很多工具都是通过 /proc 来获取它们需要的信息,例如 ps、top 和 uptime。...五、调试系统故障 即使采用了所有这些监视和调试技术,有时驱动程序中依然会有错误,这样的驱动程序执行时就会产生系统故障。 注意,“故障(fault)”并不意味着“惊恐(panic)”。

51641

NFC驱动调试

贴有NFC贴纸的产品市面上很常见。 仿真卡模式: 仿真卡模式就是将支持NFC的手机或者其他电子设备当成借记卡、信用卡、公交卡、门禁卡等IC卡使用。...基本原理就是将相应IC卡中的信息(支付凭证)封装成数据包存储支持NFC的手机中。使用时,还需要一个NFC射频器(相当于刷传统IC卡使用的刷卡器)。...i2c_del_driver(&nqx); } module_exit(nqx_dev_exit); 通过i2c_add_driver(&nqx)和i2c_del_driver(&nqx)注册相应的i2c设备驱动...nq-nci"; //在此处与 nfc_dev_fops 操作列表进行连接 nqx_dev->nqx_device.fops = &nfc_dev_fops; //注册混杂设备驱动...的QSEE环境下运行的;如果有调试到,再分析分析; 第一次使用markdown功能写博客,挺好用的;

3.3K50

Linux内核模块驱动加载与dmesg调试

1、运行环境   Ubuntu 版本:20.04   Linux内核版本:5.4.0-42-generic   gcc版本:gcc version 9.3.0   驱动和一般应用程序的执行方式很大不同...,然后应用程序触发这些函数的执行   例如:驱动程序初始化时,向内核注册处理某个设备写操作的函数   当应用程序使用write系统调用写该设备时,内核就会调用注册的上述函数 3、内核模型常见的回调函数举例...> 14 15 #include 16 17 #include 18 19 #include 20 21...,通过输入$ sudo insmod PrintModule.ko命令,之后查看dmesg查看驱动信息(也可通过输出调试信息的函数printk来进行调试),具体如下: image.png    随之通过输入...$ sudo rmmod PrintModule命令来卸载驱动,也是通过dmesg来查看内核驱动信息(也可通过输出调试信息的函数printk来进行调试): image.png

6.5K20

34.Linux-printk分析、使用printk调试驱动

本节学习目的 1)分析printk()函数 2)使用printk()调试驱动 1.驱动调试中,使用printk(),是最简单,最方便的办法 当uboot的命令行里的“console=tty1”时,表示...搜索到linux-2.6.22.6\kernel\Printk.c里的register_console(struct console *console)函数,有用到console_cmdline[]...发现printk的打印级别 include/linux/kernel.h中找到: #define KERN_EMERG ""    // 系统崩溃 #define KERN_ALERT...再判断打印级别,是否调用console->write ( PS:可以通过 dmesg 命令来打印循环缓冲区log_buf[] ) 12.printk()分析完后,接下来便来说说如何使用printk()来调试驱动...//__FILE__:   表示文件路径 //__FUNCTION__: 表示函数名 //__LINE__:   表示代码位于第几行 //KERN_DEBUG: 等于7,表示打印级别为7 然后驱动

4.6K60

Linux-hexdump命令调试event驱动—详解(13)

hexdump: 查看文件的内容,比如二进制文件中包含的某些字符串,通常用来调试驱动用 描述: 我们以event1为例,当我们insmod挂载了键盘驱动后,出现一个event1设备, 此时没有按键按下,...通过键盘驱动的read函数,若有按键按下,就会上传按键数据给用户层hexdump 因为键盘驱动的input_handler 是:evdev_handler 所以键盘驱动的read函数是: evdev_handler...比如键盘事件 __u16 code;   // 对应的事件里支持的哪个变量,比如按键K __s32 value;   // 对应的变量里的数值, 比如松开按键则是1,反之为0 }; 所以我们hexdump调试任何输入子系统...event XX驱动时,有信息就会打印上面数据  1.调试键盘驱动 (键盘驱动代码:http://www.cnblogs.com/lifexy/p/7553861.html) 以按开发板的按键 KEY_L...value=0 0000030 07c6 0000 cf70 000d 0000 0000 0000 0000 2.调试触摸屏驱动

2.2K90

基于input子系统的sensor驱动调试(一)

要想弄明白世界的本质,就要追根溯源;代码也是一样的道理; 最近调试几个sensor驱动,alps sensor驱动、compass sensor驱动、G-sensor驱动都是一样的架构; 一、基于input...子系统的sensor架构: ?...由图上可知,input子系统上的sensor是由三个子系统构成: 1、input子系统(负责上报给设备节点数据); 2、I2C子系统负责sensor driver与sensor传感器进行通信; 3、xSensor...driver则是对不同sensor做的特定的驱动(不同驱动不同代码,主要是硬件初始化的不同和采集数据上的方式不同,这些供应商已经写好); 二、xsensor驱动设计: 由sensor驱动系统中的层次...KERNEL_OBJ/drivers/input/misc目录下找到编译生成的stk3x1x.o的二进制文件; 由于Android是直接按make bootimage来编译内核生成boot.img,所以没有像linux

2.4K41

Linux系统驱动之Framebuffer驱动程序框架

资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...视频观看 百问网驱动大全 Framebuffer驱动程序框架 1....怎么编写字符设备驱动程序 驱动主设备号 构造file_operations结构体,填充open/read/write等成员函数 注册驱动:register_chrdev(major, name, &fops...Framebuffer驱动程序框架 分为上下两层: fbmem.c:承上启下 实现、注册file_operations结构体 把APP的调用向下转发到具体的硬件驱动程序 xxx_fb.c:硬件相关的驱动程序...怎么编写Framebuffer驱动程序 核心: 分配fb_info framebuffer_alloc 设置fb_info var fbops 硬件相关操作 注册fb_info register_framebuffer

3.2K30

基于input子系统的sensor驱动调试(二)

:读取i2c的id); 3、将stk3x1x驱动注册到linux input子系统; 4、创建工作队列(主要是对sensor的数据采集); 5、创建sysfs接口; 2.1 创建input子系统: http...://blog.csdn.net/ielife/article/details/7798952 1、 驱动加载模块中,设置你的input设备支持的事件类型; 2、 注册中断处理函数,例如键盘设备需要编写按键的抬起...上面代码中我们看到INIT_WORK(&ps_data->stk_ps_work, stk_ps_work_func);,其实是一个宏的定义,include/linux/workqueue.h中。...驱动层创建了sysfs接口,HAL层通过这些sysfs接口,对Sensor进行操作,如使能、设置delay等。...group for ps\n", __func__); 11 goto err_ps_sysfs_create_group; 12 } 到此,完成了sysfs接口的创建,我们可以根文件系统中看到

2.9K71

Linux系统下gdb调试(一)

这段时间逛了一下招聘网站上,对于嵌入式要求里面有要求会gdb调试,而且再加上昨天交流群里面,刚好有网友问gdb怎么调试,这让我学gdb调试的欲望越来越强烈,这不,应网友的要求,今天就来给大家分享自己总结的实战调试方法...Linux 下的GDB(GNU Debugger)是-一个用来调试C、C++程序的功能强大的调试器,它能够程序运行的过程中观察程序的内部结构和内存的使用情况。...3、gdb命令+实战演示: gdb的使用非常简单,只要在Linux的命令提示符下输入gdb命令,系统便会启动gdb。...后面继续执行的话就没断点了,可以把它想成以前keil里面进行调试类似。同时记住退出gdb是按q键就可以退出了。...但是你Linux环境编译的时候会报一个警告,不会报错,不细心的人,可能平常习惯了说有警告没啥关系,然后就直接运行,可以后面没想到,出现了下面这种情况: 下面我们使用gdb来调试这个程序:

3.8K10

Linux系统驱动之最简单的LCD驱动_基于QEMU

视频观看 百问网驱动大全 百问网技术交流群,百万嵌入式工程师聚集地: https://www.100ask.net/page/2248041 最简单的LCD驱动_基于QEMU 本节视频对应源码GIT...深入学习内核及驱动 使用QEMU可以非常方便地调试内核、查看驱动程序执行过程 有助于深入研究内核及驱动 后面的视频里,会使用QEMU来讲解某些驱动程序。...注意: 使用QEMU不是必须的 QEMU只是提供另一个角度的学习方法,比如: LCD驱动:使用QEMU可以时,可以简化硬件的操作 中断子系统:可以跟踪调用过程 你可以只看QEMU相关的视频,不使用...QEMU来操作 真实的开发板上讲解的内容,会覆盖QEMU视频的知识 1....为什么要用QEMU Linux驱动 = 驱动框架 + 硬件操作。 如果硬件操作足够简单,我们就可以把精力放在驱动程序的框架上,这才是Linux的核心。

2.8K10

IDA 6.1调试驱动

今天测试的时候发现IDA 5.5可以启动windbg调试器,而IDA 6.0却无法启动windbg调试器。...网上也有关于用IDA调试驱动的文章,这里只是再整理一下,用IDA载入驱动分析完成之后选择调试器为Windbg debugger,如图1所示: 图1 然后执行菜单中的Debugger->Debugger...图5 附加之后等待符号库加载完就可以进行调试了。调试器挂在之后如果没有意外会中断第一个int3断点,如图6所示。...图6 现在就可以对驱动进行设置断点和调试了,效果如图7所示: 图7 调试之前为了使程序的断点能够中断需要修正Process options选项中的部分参数,如图8所示。...图8 需要将Application修改为程序远程目标机器上的路径,另外Directory同样需要修改为远程系统的目录。

1.1K20

Linux驱动之Misc子系统剖析

何为Misc设备 Linux驱动分为字符设备驱动、块设备驱动和网络设备驱动,而字符设备又包括很多种,内核使用主设备号来区分各个字符设备驱动include/linux/major.h文件中已经预先定义好了各类字符设备的主设备号...使用Misc设备的好处 Misc子系统使用一个统一的主设备号来管理,当需要注册Misc驱动时,内核会为其分配次设备号。...而如果采用普通字符设备驱动的方式,无论主设备号是静态分配还是动态分配,都会消耗掉一个主设备号,而且如果系统存在着大量的无法准确归类的字符设备驱动,那会大量浪费主设备号;当需要开发一个功能较简单的字符设备驱动...misc_class); fail_remove: remove_proc_entry("misc", NULL); return err; } 先是创建了Misc类,随后将Misc子系统实现为字符设备驱动来注册到内核中...总结 Misc子系统使用同一个驱动来向上提供多个设备文件节点,向下控制多个(相应的)设备。Misc驱动本质上也是字符驱动,只是它借用Misc子系统的框架来更方便的向内核注册而已。

1.2K10

Linux驱动之Input子系统剖析

为了对多种不同类型的输入设备进行统一的处理,内核字符设备驱动上抽象出一层,即输入子系统。...输入子系统由三部分组成: 事件驱动层 输入核心层 设备驱动层 事件驱动层负责处理和应用程序的接口,向应用程序提供简单的、统一的事件接口。 设备驱动层负责与底层输入设备的通信。...三个重要结构体 都定义include/linux/input.h中。...源码分析 笔者会大体上对input子系统的源码进行分析,如若分析的有出入,还望指出。分析之前,以一张input整体架构图来呈现整个输入设备到用户空间的数据传递。...设备驱动层 以usbmouse.c为例分析鼠标的设备驱动,鼠标是挂载usb总线下,笔者在这里将usb相关的代码忽略,只关心输入子系统有关的代码。

2K20
领券