网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > linux > 系统管理 > 内核技术 > Linux 系统内核的调试  

Linux 系统内核的调试

2006-05-24  作者:网管整理  来源:bitsCN.com  点评 投稿 收藏

    调试是软件开发过程中一个必不可少的环节,在 Linux 内核开发的过程中也不可避免地会面对如何调试内核的问题。但是,Linux 系统的开发者出于保证内核代码正确性的考虑,不愿意在 Linux 内核源代码树中加入一个调试器。他们认为内核中的调试器会误导开发者,从而引入不良的修正[1].所以对 Linux 内核进行调试一直是个令内核程序员感到棘手的问题,调试工作的艰苦性是内核级的开发区别于用户级开发的一个显著特点。 网管u家u.bitscn@com

    尽管缺乏一种内置的调试内核的有效方法,但是 Linux 系统在内核发展的过程中也逐渐形成了一些监视内核代码和错误跟踪的技术。同时,许多的补丁程序应运而生,它们为标准内核附加了内核调试的支持。尽管这些补丁有些并不被 Linux 官方组织认可,但他们确实功能完善,十分强大。调试内核问题时,利用这些工具与方法跟踪内核执行情况,并查看其内存和数据结构将是非常有用的。

网管联盟bitsCN@com

    本文将首先介绍 Linux 内核上的一些内核代码监视和错误跟踪技术,这些调试和跟踪方法因所要求的使用环境和使用方法而各有不同,然后重点介绍三种 Linux 内核的源代码级的调试方法。

网管u家u.bitscn@com

    1. Linux 系统内核级软件的调试技术

网管联盟bitsCN@com

    printk() 是调试内核代码时最常用的一种技术。在内核代码中的特定位置加入printk() 调试调用,可以直接把所关心的信息打打印到屏幕上,从而可以观察程序的执行路径和所关心的变量、指针等信息。 Linux 内核调试器(Linux kernel debugger,kdb)是 Linux 内核的补丁,它提供了一种在系统能运行时对内核内存和数据结构进行检查的办法。Oops、KDB在文章掌握 Linux 调试技术有详细介绍,大家可以参考。 Kprobes 提供了一个强行进入任何内核例程,并从中断处理器无干扰地收集信息的接口。使用 Kprobes 可以轻松地收集处理器寄存器和全局数据结构等调试信息,而无需对Linux内核频繁编译和启动,具体使用方法,请参考使用 Kprobes 调试内核。

网管网www_bitscn_com

    以上介绍了进行Linux内核调试和跟踪时的常用技术和方法。当然,内核调试与跟踪的方法还不止以上提到的这些。这些调试技术的一个共同的特点在于,他们都不能提供源代码级的有效的内核调试手段,有些只能称之为错误跟踪技术,因此这些方法都只能提供有限的调试能力。下面将介绍三种实用的源代码级的内核调试方法。 网管下载dl.bitscn.com

    2. 使用KGDB构建Linux内核调试环境

网管论坛bbs_bitsCN_com

    kgdb提供了一种使用 gdb调试 Linux 内核的机制。使用KGDB可以象调试普通的应用程序那样,在内核中进行设置断点、检查变量值、单步跟踪程序运行等操作。使用KGDB调试时需要两台机器,一台作为开发机(Development Machine),另一台作为目标机(Target Machine),两台机器之间通过串口或者以太网口相连。串口连接线是一根RS-232接口的电缆,在其内部两端的第2脚(TXD)与第3脚(RXD)交叉相连,第7脚(接地脚)直接相连。调试过程中,被调试的内核运行在目标机上,gdb调试器运行在开发机上。

中国网管论坛bbs.bitsCN.com

    目前,kgdb发布支持i386、x86_64、32-bit PPC、SPARC等几种体系结构的调试器。有关kgdb补丁的下载地址见参考资料[4]. 网管u家u.bitsCN.com

    2.1 kgdb的调试原理

网管网www.bitscn.com

    安装kgdb调试环境需要为Linux内核应用kgdb补丁,补丁实现的gdb远程调试所需要的功能包括命令处理、陷阱处理及串口通讯3个主要的部分。kgdb补丁的主要作用是在Linux内核中添加了一个调试Stub.调试Stub是Linux内核中的一小段代码,提供了运行gdb的开发机和所调试内核之间的一个媒介。gdb和调试stub之间通过gdb串行协议进行通讯。gdb串行协议是一种基于消息的ASCII码协议,包含了各种调试命令。当设置断点时,kgdb负责在设置断点的指令前增加一条trap指令,当执行到断点时控制权就转移到调试stub中去。此时,调试stub的任务就是使用远程串行通信协议将当前环境传送给gdb,然后从gdb处接受命令。gdb命令告诉stub下一步该做什么,当stub收到继续执行的命令时,将恢复程序的运行环境,把对CPU的控制权重新交还给内核。 网管网www.bitscn.com

 

网管网www.bitscn.com


网管网www_bitscn_com

网管bitscn_com


网管联盟bitsCN_com

2.2 Kgdb的安装与设置 网管网www_bitscn_com

下面我们将以Linux 2.6.7内核为例详细介绍kgdb调试环境的建立过程。 网管u家u.bitscn@com

2.2.1软硬件准备 网管bitscn_com

以下软硬件配置取自笔者进行试验的系统配置情况: 网管u家u.bitsCN.com



网管论坛bbs_bitsCN_com

kgdb补丁的版本遵循如下命名模式:Linux-A-kgdb-B,其中A表示Linux的内核版本号,B为kgdb的版本号。以试验使用的kgdb补丁为例,linux内核的版本为linux-2.6.7,补丁版本为kgdb-2.2。 网管联盟bitsCN@com

物理连接好串口线后,使用以下命令来测试两台机器之间串口连接情况,stty命令可以对串口参数进行设置: 网管网www.bitscn.com

在development机上执行: 网管bitscn_com


stty ispeed 115200 ospeed 115200 -F /dev/ttyS0
 中国网管论坛bbs.bitsCN.com 

中国网管论坛bbs.bitsCN.com

在target机上执行:

网管网www.bitscn.com


stty ispeed 115200 ospeed 115200 -F /dev/ttyS0
 网管联盟bitsCN@com 

中国网管联盟bitsCN.com

在developement机上执行:

网管联盟bitsCN_com


echo hello > /dev/ttyS0
 
网管论坛bbs_bitsCN_com

网管联盟bitsCN_com

在target机上执行:

网管u家u.bitsCN.com


网管u家u.bitscn@com

cat /dev/ttyS0
 网管联盟bitsCN_com 
网管u家u.bitscn@com


TAGs   调试   系统   内核   Linux   kgdb   编译      
 上一篇:Linux 2.6内核嵌入式系统应用   下一篇:Linux 2.6内核中的文件系统变化通知机制
Linux 系统内核的调试 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: