- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第二章 驱动程序调测方法与技巧驱动程序开发的一个重大难点就是不易调试。本文目的就是介绍驱动开发中常用的几种直接和间接的调试手段,它们是:
利用printk
查看OOP消息
利用strace
利用内核内置的hacking选项
利用ioctl方法
利用/proc 文件系统
使用kgdb
一、利用printk
这是驱动开发中最朴实无华,同时也是最常用和有效的手段。scull驱动的main.c第338行如下,就是使用printk进行调试的例子,这样的例子相信大家在阅读驱动源码时随处可见。
338 //????????????? printk(KERN_ALERT wakeup by signal in process %d\n, current-pid);
printk的功能与我们经常在应用程序中使用的printf是一样的,不同之处在于printk可以在打印字符串前面加上内核定义的宏,例如上面例子中的KERN_ALERT(注意:宏与字符串之间没有逗号)。
#define KERN_EMERG 0
#define KERN_ALERT 1
#define KERN_CRIT 2
#define KERN_ERR 3
#define KERN_WARNING 4
#define KERN_NOTICE 5
#define KERN_INFO 6
#define KERN_DEBUG 7
#define DEFAULT_CONSOLE_LOGLEVEL 7
这个宏是用来定义需要打印的字符串的级别。值越小,级别越高。内核中有个参数用来控制是否将printk打印的字符串输出到控制台(屏幕或者/sys/log/syslog日志文件)
# cat /proc/sys/kernel/printk6?????? 4?????? 1?????? 7
第一个6表示级别高于(小于)6的消息才会被输出到控制台,第二个4表示如果调用printk时没有指定消息级别(宏)则消息的级别为4,第三个1表示接受的最高(最小)级别是1,第四个7表示系统启动时第一个6原来的初值是7。
因此,如果你发现在控制台上看不到你程序中某些printk的输出,请使用echo 8 /proc/sys/kernel/printk来解决。
我们在复杂驱动的开发过程中,为了调试会在源码中加入成百上千的printk语句。而当调试完毕形成最终产品的时候必然会将这些printk语句删除(为什么?想想你自己是驱动的使用者而不是开发者吧。记住:己所不欲,勿施于人),这个工作量是不小的。最要命的是,如果我们将调试用的printk语句删除后,用户又报告我们的驱动有bug,所以我们又不得不手工将这些上千条的printk语句再重新加上。oh,my god,杀了我吧。所以,我们需要一种能方便地打开和关闭调试信息的手段。哪里能找到这种手段呢?哈哈,远在天边,近在眼前。看看scull驱动或者leds驱动的源代码吧!
#define LEDS_DEBUG#undef PDEBUG???????????? /* undef it, just in case */#ifdef LEDS_DEBUG??? #ifdef __KERNEL__???? /* This one if debugging is on, and kernel space */??????? #define PDEBUG(fmt, args...) printk( KERN_EMERG leds: fmt, ## args)??? #else???? /* This one for user space */??????? #define PDEBUG(fmt, args...) fprintf(stderr, fmt, ## args)??? #endif#else??? #define PDEBUG(fmt, args...) /* not debugging: nothing */#endif#undef PDEBUGG#define PDEBUGG(fmt, args...) /* nothing: its a placeholder */
这样一来,在开发驱动的过程中,如果想打印调试消息,我们就可以用PDEBUG(address of i_cdev is %p\n, inode-i_cdev);,如果不想看到该调试消息,就只需要简单的将PDEBUG改为PDEBUGG即可。而当我们调试完毕形成最终产品时,只需要简单地将第1行注释掉即可。
上边那一段代码中的__KERNEL__是内核中定义的宏,当我们编译内核(包括模块)时,它会被定义。当然如果你不明白代码中的...和##是什么
您可能关注的文档
- 02 VFP课件09版 数据库、表及索引1 表的创建.ppt
- 02 管理文件及目录.ppt
- 02 拉伸、压缩和剪切.ppt
- 02 商品及价值.doc
- 02.第二章常见网络接口和电缆.pdf
- 02-02-01水中悬浮物质及胶体物质的去除(沉淀).pdf
- 02----Linux操作系统案例教程电子教案_第2节_系统安装.ppt
- 02-有机化合物的命名、结构及物理性质.ppt
- 2 CISCO和华为设备的操作系统和设备结构基于华为.doc
- 2 MATLAB和Simulink基础.pdf
- 2025年电大专科个人与团队管理机考易错题.docx
- 2025年电大《证据学》考试复习资料(单、多选各100题)附加答案.docx
- 2025年电大学前教育本科《幼儿游戏与玩具》期末考试选择题题库.docx
- 2025年电大《西方行政学说》期末考试试题资料集及答案.docx
- 2025年电大人力资源管理期末考试题库及答案真题题库.docx
- 2025年甘肃省初级消防设施操作员《技能操作》考试题库(含答案解析).docx
- 2025年特种设备安全管理人员(特种作业)考试题库(完整版).docx
- 2025年环保知识竞赛题库及答案(共50题).docx
- 2025年生活百科知识竞赛问答题(附答案).docx
- 2025年爱国知识竞赛题及答案.docx
原创力文档


文档评论(0)