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

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

上一篇我们大概聊了如何写一个简单的字符设备驱动,我们不是神,写代码肯定会出现问题,我们需要在编写代码的过程中不断调试。...在普通的c应用程序中,我们经常使用printf来输出信息,或者使用gdb来调试程序,那么驱动程序如何调试呢?...下面就根据一个简单的实例来说明如何调试驱动程序。...如何根据oops定位代码行 我们借用linux设备驱动第二篇:构造和运行模块里面的hello world程序来演示出错的情况,含有错误代码的hello world如下: #include <linux/...printk的使用方法类似printf,只是要注意一下打印级别,详细介绍在linux设备驱动第二篇:构造和运行模块中已有描述,另外需要注意的是大量使用printk会严重拖慢系统,所以使用过程中也要注意。

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

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

同样的打印语句可以在内核代码中也可以在用户级代码使用,因此,关于这些额外的调试信息,驱动程序和测试程序可以用同样的方法来进行管理。...驱动程序开发人员可以用如下方法对系统进行查询:在proc 文件系统中创建文件、使用驱动程序的 ioctl 方法,以及通过 sysfs 导出属性等。...下面我们将使用这个方法针对 scull 驱动程序创建一个 /proc 文件。...作为替代 /proc 文件系统的方法,我们可以专为调试设计若干 ioctl 命令。这些命令从驱动程序复制相关的数据到用户空间,然后可在用户空间中检验这些数据。...五、调试系统故障 即使采用了所有这些监视和调试技术,有时驱动程序中依然会有错误,这样的驱动程序在执行时就会产生系统故障。 注意,“故障(fault)”并不意味着“惊恐(panic)”。

51241

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

本节学习目的 1)分析printk()函数 2)使用printk()调试驱动 1.在驱动调试中,使用printk(),是最简单,最方便的办法 当uboot的命令行里的“console=tty1”时,表示...2.我们以“console=ttySA0,115200”为例,进入linux-2.6.22.6\kernel\printk.c 找到以下一段: __setup("console=", console_setup...搜索到在linux-2.6.22.6\kernel\Printk.c里的register_console(struct console *console)函数,有用到console_cmdline[]...5.我们以2410为例(linux-2.6.22.6\drivers\serial\S3c2410.c): static int s3c24xx_serial_initconsole(void) {...再判断打印级别,是否调用console->write ( PS:可以通过 dmesg 命令来打印循环缓冲区log_buf[] ) 12.printk()分析完后,接下来便来说说如何使用printk()来调试驱动

4.6K60

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

因为近期用到了Linux内核的相关知识,下面随笔将给出内核模块的编写记录,供大家参考。...1、运行环境   Ubuntu 版本:20.04   Linux内核版本:5.4.0-42-generic   gcc版本:gcc version 9.3.0   驱动和一般应用程序的执行方式很大不同... 16 17 #include 18 19 #include 20 21 22 23 #define DEVICE_NAME...,通过输入$ sudo insmod PrintModule.ko命令,之后查看dmesg查看驱动信息(也可通过输出调试信息的函数printk来进行调试),具体如下: image.png    随之通过输入...$ sudo rmmod PrintModule命令来卸载驱动,也是通过dmesg来查看内核驱动信息(也可通过输出调试信息的函数printk来进行调试): image.png

6.5K20

linux GDB调试c++程序

或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。...从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能...,否则无法调试执行文件 ?...3.3 调试  运行 输入run 或者r  ?          3.3 单步调试,step 或者 s进入函数内部 ?                ...3.6  继续运行直到下一个断点或主函数结束continue或者c ?                   3.7 退出调试 输入q ?

4.7K20

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...0000 cf70 000d 0000 0000 0000 0000 2.调试触摸屏驱动 (触摸屏驱动代码: ) /dev/event0

2.2K90

IDA 6.1调试驱动

网上也有关于用IDA调试驱动的文章,这里只是再整理一下,用IDA载入驱动分析完成之后选择调试器为Windbg debugger,如图1所示: 图1 然后执行菜单中的Debugger->Debugger...如果使用IDA 5.5 设置方法是类似的,与上一篇文章《IDA调试内核》http://www.h4ck.org.cn/2011/05/kernel-debugging-with-ida-pro/ 不同的是本文的调试没有使用第三方的工具...,并且实现方法也比较简单。...如果调试没有源码的驱动用IDA应该会更直观一些吧,如果有源码的话还是使用Windbg更好一些。...注意: 需要注意的是前提已经配置好了Windbg的远程调试,否则使用IDA是无法连接虚拟机进行调试的,设置方法可以参考下面的连接: Windows 7:http://www.h4ck.org.cn/2010

1.1K20

Dev-C++单步调试方法

参考链接: C++ ungetc() 前言  最近在看FishC大佬的C++教程,遇到一堆问题,慢慢写吧。 ...如何使用Dev-C++软件调试  调试程序如下:  #include #include void main() {       int i;       int...            */       }       printf("结果是: %d", sum);       printf("\n");       system("pause"); }   Dev-C+...第二步-添加变量  添加一个你需要观察的变量,选中这个变量,右击选择“添加查看”即可  第三步-调试运行  点击调试按钮  跳出命令行窗口  按下回车键即可。 ...第四步-单步调试  此时点击下一步按钮,进行单步调试,   可以看到左侧调试框中出现了之前设置的观察变量的值。  此时可以观察到变量i的变化情况,12, 4,6,8加起来刚好是30。

1.5K10

linux下的程序调试方法汇总

那么调试工具就显得尤为重要,linux作为笔者重要的开发平台,在linux中讨论调试工具主要是为那些入门者提供一些帮助。调试工具能让我们能够监测、控制和纠正正在运行的程序。...在Linux下的用户空间调试工具主要有系统工具和专门调试工具:'print' 打印语句,这是新手最常用的,也是最不提倡使用的;查询 (/proc, /sys 等)系统的虚拟文件查看,这个方法有局限性;跟踪...print' 语句 这是一个基本的调试问题的方法。 我们在程序中怀疑的地方插入print语句来了解程序的运行流程控制流和变量值的改变。 这是一个最简单的技术, 它的缺点。...若需要调试的程序比较大,这将是一个耗时费力的方法。 2. 查询 在某些情况下,我们需要弄清楚在一个运行在内核中的进程的状态和内存映射。为了获得这些信息,我们不需要在内核中插入任何代码。...在GDB中获得帮助 总结 在这篇文章中,我们已经看到不同类型的Linux用户空间的调试工具。

3.9K21

IIC设备驱动实例调试

记录一次自己调试linux开发板iic器件(ap3216c光敏设备)。 概述: iic通讯线一般只有两条,一条用于时钟控制,一条用于数据通讯。当然也存在单总线通讯,像单片机经常用到的ds18b20。...撸码: 1详细信息: 平台:imx6ull开发板 linux版本:4.9.88 开发编辑器:gediit 2概要: 在linux源码中,已经实现了iic主机通讯协议传输的各种传输接口。...在系统初始化时,会遍历iic驱动链表将本驱动注册。具体原理可查阅代码include/linux/i2c.h。...由于我在家调试时,房间开灯,所以数据差值不是太大。具体调试,可自行实验。 总结: 本篇主要记录了iic设备ap3216c驱动简单实现,对于iic通讯原理并没有做太详细的分析。...对于使用过单片机调试iic设备的同学,对于iic通讯应该很熟悉了,主要就是对linux驱动注册流程稍加研究即可。

1.3K20

36.Linux驱动调试-根据oops定位错误代码行

~c03cebf4 所以,pc值bf000078为的驱动模块的地址值 2.4当有多个驱动装载时,又如何区分PC值是哪个驱动的函数的地址值?...first_drv_open()函数下的bf000000+0x78中 2.5然后将驱动生成反汇编: arm-linux-objdump -D 26th_segmentfault.ko >26th_segmentfault.dis...而0x56000050是个物理地址,在linux眼中便是个非法地址,所以出错 并找到出错地方位于first_drv_open ()函数下: 3.若发生错误的驱动位于内核的地址值时 3.1还是以26th_segmentfault.c...为例,首先加入内核: #cp 26th_segmentfault.c /linux-2.6.22.6/drivers/char/ //将有问题的驱动复制到字符驱动目录下 #vi Makefile...,便会打印出opps信息 3.3在内核源码的根目录下通过: # arm-none-linux-gnueabi-objdump -D vmlinux > vmlinux.dis 将整个内核反汇编, vmlinux

2.6K80
领券