《嵌入式Linux系统开发标准教程》9 内核调试技术.pdf
上传人:qw****27 上传时间:2024-09-12 格式:PDF 页数:33 大小:1.4MB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

《嵌入式Linux系统开发标准教程》9 内核调试技术.pdf

《嵌入式Linux系统开发标准教程》9内核调试技术.pdf

预览

免费试读已结束,剩余 23 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

嵌入式学院—华清远见旗下品牌:www.embedu.org《嵌入式Linux系统开发标准教程》《嵌入式Linux系统开发标准教程》——第9章、内核调试技术第9章内核调试技术本章目标本章介绍了各种Linux内核调试方法。内核的调试需要从内核源码本身、调试工具等方面做好准备。通过本章的学习,读者可以了解不同调试方式的特点和使用方法,根据需要选择不同的内核调试方式。内核调试方法内核打印函数获取内核信息处理出错信息内核源码调试嵌入式学院—华清远见旗下品牌:www.embedu.org《嵌入式Linux系统开发标准教程》——第9章、内核调试技术9.1内核调试方法对于庞大的Linux内核软件工程,单靠阅读代码查找问题已经非常困难,需要借助调试技术解决BUG。通过合适的调试手段,可以有效地查找和判断BUG的位置和原因。9.1.1内核调试概述当内核运行出现错误的时候,首先要明确定义和可靠地重现这个错误现象。如果一个BUG不能重现,修正起来只有凭想象和读代码。内核、用户空间和硬件之间的交互非常,在特定配置、特定机器、特殊负载条件下,运行某些程序可能会产生一个BUG,其他条件下就不一定产生。这在嵌入式Linux系统上很常见,例如:在X86平台上运行正常的驱动程序,在ARM平台上就可能会出现BUG。在跟踪BUG的时候,掌握的信息越多越好。内核的BUG是多种多样的。可能由于不同原因出现,并且表现形式也多种多样。BUG范围,从完全不正确的代码(例如:没有在适当的地址存储正确的值)到同步的错误(例如:不适当地对一个共享变量加锁)。它们的表现形式也各种各样,从系统崩溃的错误操作到系统性能差等。通常BUG是一系列事件,内核代码的错误使得用户程序出现错误。例如:一个不带引用数的共享结构体可能引起条件竞争。没有合适的统计,一个进程可以释放这个结构体,但是另外一个进程仍然想要用它。再往下,第二个进程可能会使用通过一个无效的指针访问一个不存在的结构体。这就会导致NULL指针废弃、读垃圾数据,如果这个数据还没有被覆盖,也可能基本正常。NULL指针废弃会产生oops;垃圾数据导致数据错误(接下来可能是错误的行为或者oops);应用程序报告oops或者错误的行为。内核开发者必须处理这个错误,知道这个数据是在释放以后访问的,这存在一个条件竞争。修正的方法是为这个结构体添加引用计数,并且可能需要加锁保护。调试内核很难,实际上内核不同于其他软件工程。内核有操作系统独特的问题,例如:时间管理和条件竞争,这可以使多个线程同时在内核中执行。因此,调试BUG需要有效的调试手段。几乎没有一种调试工具或者方法能够解决全部问题。即使在一些集成测试环境中,也要划分不同测试调试功能,例如:跟踪调试、内存泄漏测试、性能测试等。掌握的调试方法越多,调试BUG就越方便。Linux有很多开放源代码的工具,每一个工具的调试功能专一,所以这些工具的实现一般也比较简单。9.1.2学会分析内核源程序正是由于内核的复杂性,无论使用什么调试手段,都需要熟悉内核源码。只有熟悉了内核各部分的代码实现,才能够找到准确的跟踪点;只有熟悉操作系统的内核机制,才能准确地判断系统运行状态。对于初学者来说,阅读内核源代码将是非常枯燥的工作。最好先掌握一种搜索工具,学会从源码树中搜索关键词。当能够对内核源代码进行情景分析的时候,你就能感到其中的乐趣了。嵌入式学院—华清远见旗下品牌:www.embedu.org《嵌入式Linux系统开发标准教程》——第9章、内核调试技术调试是无法逃避的任务。进行调试有很多种方法,比如将消息打印到屏幕上、使用调试器,或只是考虑程序执行的情况并仔细地分析问题所在。在修正问题之前,必须先找出问题的源头。举例来说,对于段错误,需要了解段错误发生在代码的哪一行。一旦发现了代码中出错的行,请确定该方法中变量的值、方法被调用的方式以及关于错误如何发生的详细情况。使用调试器将使找出所有这些信息变得很简单。如果没有调试器可用,还可以使用其他的工具。(请注意:有些Linux软件产品中可能并不提供调试器)。9.1.3调试方法介绍内核调试方法很多,主要有以下4类。n通过打印函数。n获取内核信息。n处理出错信息。n内核源码调试。在调试内核之前,通常需要配置内核的调试选项。图9.1给出了“Kernelhacking”配菜单下的各种调试选项。不同的调试方法,需要配置对应的选项。每一种调试选项针对不同的调试功能。并且不是所有的调试选项在所有的平台上都能够支持。这里介绍一些“Kerne