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