Linux设备驱动程序调试方法.pdfVIP

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux 设备驱动程序调试方法 国防科技大学 计算机学院 张一鸣 由于设备驱动程序运行于内核空间,因此有着与用户空间程序不同的调试方法。 1.1 简介 设备驱动程序的调试需要内核的支持,因此通常应该根据需要对内核进行重编译。下面 以2.6.11 版的Linux 内核为例进行介绍,其他版本的内核编译方法与此类似。 1. 进入编译选项配置界面。 (1)如果不清楚当前正在运行的内核源代码的目录,可以通过如下方法查看。 (2 )进入内核源代码所在目录,通过make menuconfig 命令进入编译选项配置环境, 如图1.1 所示。 调试内核 图1.1 编译选项配置环境 在选项配置环境中每个选项有 “*”(编译进内核)、“M ”(以模块方式编译)和 “”(不 编译)三种状态,可以分别使用 “Y ”、“M ”和 “N ”键来设置。 2 .配置编译选项 如图1.2 所示,在Kernel hacking 下有很多选项,分别对应不同的内核调试功能。 图1.2 内核调试选项 其中需要注意的有如下几点。 (1)Kernel debugging 选项 (对应于CONFIG_DEBUG_KERNEL )应设为 “*”,只有 把该选项选为 “*”,才能够使其他内核调试选项可见。 (2 )使用gdb 调试内核需要在编译内核的时候应选中Compile the kernel with debug info 选项 (CONFIG_DEBUG_INFO),否则gdb 将无法对内核符号进行解析。(?是这样吗) (2 )Spinlock debugging 选项 (对应于 CONFIG_DEBUG_SPINLOCK)应设为 “*”, 这样系统将检查到例如对没有初始化的spinlock 的操作、对同一个锁解锁多次等类似错误。 (3 )Sleep-inside-spinlock checking 选项 (对应于CONFIG_DEBUG_SPINLOC_SLEEP ) 通常可不选。选中该选项将使系统检查到占有 spinlock 的进程进入sleep 状态的错误,但是系 统在进程只是有可能sleep 的情况下也会发出警告,从而可能在正常情况下产生大量无用信 息。在使用VMware 虚拟机的时候这种现象尤为明显。 (4 )Kprobes 选项 (对应于 CONFIG_KPROBES )通常可不选。该选项的作用是使人们 能够通过 register_kprobe() 函数在内核中适当的位置设置自定义的回调函数。但是选中该选项 将会定义一个和kdb 中同名的函数 (用于产生int3 中断),造成冲突。如果希望使用kdb ,则 不应选中Kprobes 选项。 (5 )如果打了kdb 的patch,那么在最后将会有Built-in Kernel Debugger support 选项, 我们将在1.8 节 “使用kdb ”中进行介绍。 (6 )在顶层选项的Loadable module support 中只有选中Module versioning support 选项, 才能够为模块添加版本支持机制。(通常可以不选)。 设置完成后保存并退出编译选项配置环境,通过make install 命令编译内核。(或者使用 make bzImage ,make modules,make modules_install,make install)。编译完成后即可对内核进 行调试了。 1.2 使用printk() 1.2.1 简介 通常认为真正的高手和初学者都只使用printk() 来调试内核。从某种程度上说,printk()就 是内核里的printf()。 如果 klogd 和 syslogd 都已经运行,那么 printk() 将把消息打印到 console 或者 /var/log/messages 文件中。 例如 消息通常会打印到console 上或者/var/log/messages

文档评论(0)

文档终结者 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档