第9章内核调试技术(免费阅读).pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
本章目标 内核调试方法 内核打印函数 获取内核信息 处理出错信息 内核源码调试 9.1 内核调试方法 对于庞大的Linux内核软件工程,单靠阅读代码查找问题已经非常困难,需要借助调试技术解决BUG。通过合适的调试手段,可以有效地查找和判断BUG的位置和原因。 9.1.1 内核调试概述 调试内核很难,实际上内核不同于其他软件工程。内核有操作系统独特的问题,例如:时间管理和条件竞争,这可以使多个线程同时在内核中执行。 因此,调试BUG需要有效的调试手段。几乎没有一种调试工具或者方法能够解决全部问题。即使在一些集成测试环境中,也要划分不同测试调试功能,例如:跟踪调试、内存泄漏测试、性能测试等。掌握的调试方法越多,调试BUG就越方便。Linux有很多开放源代码的工具,每一个工具的调试功能专一,所以这些工具的实现一般也比较简单。 9.1.2 学会分析内核源程序 按书上进行学习,并在机器上实验 9.1.3 调试方法介绍 内核调试方法很多,主要有以下4类。 ? 通过打印函数 ? 获取内核信息 ? 处理出错信息 ? 内核源码调试 9.2 内核打印函数 嵌入式系统一般都可以通过串口与用户交互。大多数Bootloader可以向串口打印信息,并且接收命令。内核同样可以向串口打印信息。但是在内核启动过程中,不同阶段的打印函数不同。分析这些打印函数的实现,可以更好地调试内核。 9.2.1 内核映像解压前的串口输出函数 decompresss_kernel()函数调用了putstr()函数,直接向串口打印内核解压的信息。 9.2.2 内核错误报告子程序 怎样才能报告这种错误信息呢?可以通过printascii子程序来向串口打印。 printascii、printhex8等子程序包含在arch/arm/kernel/debug.S文件中。 9.2.3 内核打印函数 Linux内核标准的系统打印函数是printk。printk函数具有极好的健壮性,不受内核运行条件的限制,在系统运行期间都可以使用。 9.3 获取内核信息 Linux内核提供了一些与用户空间通信的机制,大部分驱动程序与用户空间的接口都可以作为获取内核信息的手段。另外内核也有专门的调试机制。 9.3.1 系统请求键 9.3.2 通过/proc接口 proc文件系统是一种伪文件系统。实际上,它并不占用存储空间,而是系统运行时在内存中建立的内核状态映射,可以瞬时地提供系统的状态信息。 9.3.3 通过/sys接口 Sysfs文件系统是Linux 2.6内核新增加的文件系统。它也是一种伪文件系统,是在内存中实现的文件系统。它可以把内核空间的数据、属性、链接等东西输出到用户空间。 在Linux 2.6内核中,sysfs和kobject是紧密结合的,成为驱动程序模型的组成部分。 9.3.4 通过ioctl方法 ioctl是对一个文件描述符响应的系统调用,它可以实现特殊命令操作。ioctl可以替代/proc文件系统,实现一些调试的命令。 使用ioctl获取信息比/proc麻烦一些,因为通过应用程序的ioctl函数调用并且显示结果必须编写、编译一个应用程序,并且与正在测试的模块保持一致。反过来,驱动程序代码比实现/proc文件相对简单一点。 9.4 处理出错信息 当系统出现错误时,内核有两个基本的错误处理机制:oops和panic。 9.4.1 oops信息 (1)oops消息包含系统错误的详细信息 stem.map,完全可以分析一下的。不过,还有一个更好的工具来辅助分析。 (2)使用ksymoops转换oops信息 (3)内核kallsyms选项支持符号信息 9.4.2 panic 当系统发生严重错误的时候,将调用panic()函数。 9.5 内核源码调试 因为Linux内核程序是GNU GCC编译的,所以对应地使用GNU GDB调试器。Linux应用程序需要gdbserver辅助交叉调试。那么内核源代码调试时,谁来充当gdbserver的角色呢? 9.5.1 KGDB调试内核源代码 KGDB是Linux内核调试的一种机制。它使用远程主机上的GDB调试目标板上的Linux内核。 准确地说,KGDB是内核的功能扩展,它在内核中使用插桩(Stub)的机制。 遵循下面的步骤来设置KGDB调试环境。 (1)配置编译Linux内核映像 (2)在目标板上启动内核 (3)启动gdb,建立连接 (4)使用gdb的调试命令设置断点,跟踪调试 9.5.2 BDI2000调试内核源代码 下面说明一下BDI2000调试Linux内核的操作步骤。 (1)主机/目标机设置 (2)准备要调试的内核 (3)通过BDI2000控制硬件开发板 (4)设

文档评论(0)

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

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

1亿VIP精品文档

相关文档