驱动的调试

编程入门 行业动态 更新时间:2024-10-20 03:44:37

驱动的调试

驱动的调试

驱动的调试

1、使用 printk 函数

最简单的方法是使用 printk 函数,printk 函数中可以使用附加不同的日志级别或消息优先级,如下例子:

printk(KERN_DEBUG “Here is :%s: %i \n”,__FILE,__LINE__);

上述例子中宏 KERN_DEBUG 和后面的 ”” 之间没有逗号,因为宏实际是字符串,在编译时会由编译器将它和后面的文本拼接在一起。在头文件<linux/kernel.h>中定义了 8 种可用的日志级别字符串:

//数值越小等级越高
0 KERN_EMERG		//紧急消息。系统崩溃之前提示,表示系统已不可用。
1 KERN_ALERT		//报告消息。表示必须立即采取措施。
2 KERN_CRIT			//临界消息。通常涉及严重的硬件或软件操作失败。
3 KERN_ERR			//错误消息。串口日志的默认级别。驱动程序常用 KERN_ERR 来报告硬件的错误。
4 KERN_WARNING		//警告消息。对可能出现问题的情况进行警告。
5 KERN_NOTICE		//正常但又重要的消息。用于提醒,常用于与安全相关的消息。
6 KERN_INFO			//提示消息。如驱动程序启动时,打印硬件消息。
7 KERN_DEBUG		//调试消息。设置此级别会打印所有日志消息。

查看系统使用的日志等级信息

cat /proc/sys/kernel/printk

通常情况下,上述命令会输出 7 4 1 7

这四个数字依次对应 console_loglevel,default_message_loglevel,minimum_console_loglevel,default_console_loglevel。

console_loglevel:控制台使用的日志级别;

default_message_loglevel:调用 printk() 未指定日志级别时使用的日志级别;

minimum_console_loglevel:允许设置的控制台日志级别(console_loglevel)最小值;

default_console_loglevel:系统启动时使用的日志级别。

当优先级小于 Console_loglevel 这个整数时,消息才能被显示到控制台,如果系统运行了 klogd 和 syslogd 则内核将把消息输出到/var/log/messages 中。

2、使用/proc 文件系统

  /proc 文件系统是由程序创建的文件系统,内核利用它向外输出信息。/proc 目录下的每一个文件都被绑定到一个内核函数,这个函数在此文件被读取时,动态地生成文件的内容。典型的例子就是 ps、top 命令就是通过读取/proc 下的文件来获取他们需要的信息。
  大多数情况下 proc 目录下的文件是只读的。使用/proc 的模块必须包含<linux/proc_fs.h>头文件。
  接口函数 read_proc 可用与输出信息,其定义如下:

函数原型:int (*read_proc)(char *page, char **start, off_t offset, int count, int *eof, void *data);
参    数:Page,将要写入数据的缓冲区指针。Start,数据将要写入的页面位置。Offset,页面中的偏移量。count,写入的字节数。eof,指向一个整形数,当没有更多数据时,必须设置这个参数。data,驱动程序特定的数据指针,可用于内部使用。
返 回 值:实际放入页面缓冲区的数据字节数

  如何建立函数与/proc 目录下的文件之间的关联,使用 create_proc_read_entry() 函数,其定义如下:

函数原型:struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode, struct proc_dir_entry *parent);
参    数:Name,文件名称。Mode,文件权限。Parent,文件的父目录的指针,为 null 时代表父目录为/proc。
返 回 值:

  要从 /proc 中删除一个文件,可以使用 remove_proc_entry 函数:

函数原型:void remove_proc_entry( const char *name, struct proc_dir_entry *parent );
参    数:Name,文件名称。Parent,文件的父目录的指针,为 null 时代表父目录为/proc。
返 回 值:

3、使用 ioctl 方法

  ioctl 系统调用会调用驱动的 ioctl 方法,我们可以通过设置不同的命名号来编写一些测试函数,使用 ioctl 系统调用在用户级调用这些函数进行调试。

4、使用 strace 命令进行调试

  strace 命令是一个功能强大的工具,它可以显示用户空间的程序发出的全部系统调用,不仅可以显示调用,还可以显示调用的参数和用符号方式表示的返回值。

Strace 有几个有用的参数
-t 显示调用发生的时间
-T 显示调用花费的时间
-e 限定被跟踪的系统调用的类型
-o 将输出重定向到一个文件

  Strace 是从内核接收信息,所以它可以跟踪没有使用调试方式编译的程序。还可以跟踪一个正在运行的进程。可以使用它生成跟踪报告,交给应用程序开发人员;但是对于内核开发人员同样有用。我们可以通过每次对驱动调用的输入输出数据的检查,来发现驱动的工作是否正常。

更多推荐

驱动的调试

本文发布于:2023-11-16 23:09:49,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1635156.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!