📄 linux 系统内核的调试.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0061)http://www.sofoo.com/Website/index.php?ChannelID=49&NewsID=22 -->
<HTML><HEAD><TITLE>Linux 系统内核的调试 @ 北京中研世纪科技有限公司</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META
content=主营业务:网站建设、网站设计、网站制作、网站推广及网站优化,提供网站建设网站推广相结合的建站方案,PHP专业开发团队;域名、虚拟主机提供商;
name=description>
<META content=网站建设,网页设计,北京网站建设,北京网页设计,网络推广 name=keywords>
<META content="本页版权网站建设|网页设计|北京网站建设|北京网页设计-中研世纪所有。All Rights Reserved"
name=copyright><LINK href="Linux 系统内核的调试.files/style.css" type=text/css
rel=stylesheet><LINK href="Linux 系统内核的调试.files/menu_style.css" type=text/css
rel=stylesheet>
<SCRIPT language=javascript src="Linux 系统内核的调试.files/dropdownC.js"
type=text/JavaScript></SCRIPT>
<SCRIPT language=javascript src="Linux 系统内核的调试.files/dropdown_initialize.js"
type=text/JavaScript></SCRIPT>
<SCRIPT language=javascript src="Linux 系统内核的调试.files/opensrs.js"
type=text/JavaScript></SCRIPT>
<SCRIPT language=javascript src="Linux 系统内核的调试.files/XMLMenuScript.js"
type=text/JavaScript></SCRIPT>
<SCRIPT language=javascript src="Linux 系统内核的调试.files/common.js"
type=text/JavaScript></SCRIPT>
<SCRIPT src="Linux 系统内核的调试.files/urchin.js" type=text/javascript>
</SCRIPT>
<SCRIPT type=text/javascript>
_uacct = "UA-1250461-2";
urchinTracker();
</SCRIPT>
<META content="MSHTML 6.00.2900.3199" name=GENERATOR></HEAD>
<BODY text=#000000 bgColor=#ffffff leftMargin=0
background="Linux 系统内核的调试.files/top_back.gif" topMargin=0 onload=init();
marginheight="0" marginwidth="0">
<SCRIPT src="Linux 系统内核的调试.files/channel_nav.js.htm"></SCRIPT>
<TABLE cellSpacing=0 cellPadding=0 width=1004 bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD vAlign=top width=778>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=title width="100%"
background="Linux 系统内核的调试.files/main_01a.gif" height=26> 网站相关</TD></TR>
<TR>
<TD width="100%" background="Linux 系统内核的调试.files/main_02.gif"
height=1></TD></TR>
<TR>
<TD vAlign=top width="100%" height=300>
<DIV align=right>
<TABLE cellSpacing=0 cellPadding=10 width="95%" align=center
border=0>
<TBODY>
<TR>
<TD class=neirong>
<TABLE cellSpacing=0 cellPadding=0 width="98%" align=center
border=0>
<TBODY>
<TR>
<TD style="LINE-HEIGHT: 16pt" vAlign=top height=300>
<P style="FONT-SIZE: 14px; LINE-HEIGHT: 20pt"
align=center><B>Linux 系统内核的调试</B></P>
<P style="FONT-SIZE: 11px; LINE-HEIGHT: 20pt"
align=center>[日期:2006-02-27] </P>
<P style="LINE-HEIGHT: 16pt"><FONT id=Zoom>
<BLOCKQUOTE>
<P><A
href="http://www.sofoo.com/Website/index.php?ChannelID=49&NewsID=22#author"><FONT
color=#996699>李树雷 </FONT></A>, 清华大学计算机系硕士研究生<BR><A
href="http://www.sofoo.com/Website/index.php?ChannelID=49&NewsID=22#author"><FONT
color=#996699>陈渝 </FONT></A>, 清华大学</P>
<P>本文将首先介绍 Linux
内核上的一些内核代码监视和错误跟踪技术,这些调试和跟踪方法因所要求的使用环境和使用方法而各有不同,然后重点介绍三种
Linux 内核的源代码级的调试方法。</P></BLOCKQUOTE>
<DIV>调试是软件开发过程中一个必不可少的环节,在 Linux
内核开发的过程中也不可避免地会面对如何调试内核的问题。但是,Linux
系统的开发者出于保证内核代码正确性的考虑,不愿意在 Linux
内核源代码树中加入一个调试器。他们认为内核中的调试器会误导开发者,从而引入不良的修正[1]。所以对 Linux
内核进行调试一直是个令内核程序员感到棘手的问题,调试工作的艰苦性是内核级的开发区别于用户级开发的一个显著特点。
</DIV>
<DIV>尽管缺乏一种内置的调试内核的有效方法,但是 Linux
系统在内核发展的过程中也逐渐形成了一些监视内核代码和错误跟踪的技术。同时,许多的补丁程序应运而生,它们为标准内核附加了内核调试的支持。尽管这些补丁有些并不被
Linux
官方组织认可,但他们确实功能完善,十分强大。调试内核问题时,利用这些工具与方法跟踪内核执行情况,并查看其内存和数据结构将是非常有用的。</DIV>
<DIV>本文将首先介绍 Linux
内核上的一些内核代码监视和错误跟踪技术,这些调试和跟踪方法因所要求的使用环境和使用方法而各有不同,然后重点介绍三种
Linux 内核的源代码级的调试方法。</DIV>
<DIV><A name=IDAPSYMB>1. Linux 系统内核级软件的调试技术</A></DIV>
<DIV>printk() 是调试内核代码时最常用的一种技术。在内核代码中的特定位置加入printk()
调试调用,可以直接把所关心的信息打打印到屏幕上,从而可以观察程序的执行路径和所关心的变量、指针等信息。
Linux 内核调试器(Linux kernel debugger,kdb)是 Linux
内核的补丁,它提供了一种在系统能运行时对内核内存和数据结构进行检查的办法。Oops、KDB在文章掌握 <A
href="http://www-128.ibm.com/developerworks/cn/linux/l-kdbug/index.html">Linux
调试技术</A>有详细介绍,大家可以参考。 Kprobes
提供了一个强行进入任何内核例程,并从中断处理器无干扰地收集信息的接口。使用 Kprobes
可以轻松地收集处理器寄存器和全局数据结构等调试信息,而无需对Linux内核频繁编译和启动,具体使用方法,请参考<A
href="http://www-128.ibm.com/developerworks/cn/linux/l-kprobes.html">使用
Kprobes 调试内核</A>。</DIV>
<DIV>以上介绍了进行Linux内核调试和跟踪时的常用技术和方法。当然,内核调试与跟踪的方法还不止以上提到的这些。这些调试技术的一个共同的特点在于,他们都不能提供源代码级的有效的内核调试手段,有些只能称之为错误跟踪技术,因此这些方法都只能提供有限的调试能力。下面将介绍三种实用的源代码级的内核调试方法。</DIV><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%"
border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt=""
src="Linux 系统内核的调试.files/blue_rule.gif"
width="100%"></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 align=right>
<TBODY>
<TR align=right>
<TD></TD></TR></TBODY></TABLE><BR><BR>
<DIV><A name=IDA5SYMB>2. 使用KGDB构建Linux内核调试环境</A></DIV>
<DIV>kgdb提供了一种使用 gdb调试 Linux
内核的机制。使用KGDB可以象调试普通的应用程序那样,在内核中进行设置断点、检查变量值、单步跟踪程序运行等操作。使用KGDB调试时需要两台机器,一台作为开发机(Development
Machine),另一台作为目标机(Target
Machine),两台机器之间通过串口或者以太网口相连。串口连接线是一根RS-232接口的电缆,在其内部两端的第2脚(TXD)与第3脚(RXD)交叉相连,第7脚(接地脚)直接相连。调试过程中,被调试的内核运行在目标机上,gdb调试器运行在开发机上。</DIV>
<DIV>目前,kgdb发布支持i386、x86_64、32-bit
PPC、SPARC等几种体系结构的调试器。有关kgdb补丁的下载地址见参考资料[4]。</DIV>
<DIV><A name=IDAGTYMB>2.1 kgdb的调试原理</A></DIV>
<DIV>安装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的控制权重新交还给内核。</DIV><BR><A
name=IDANTYMB><B></B></A><BR><IMG height=224 alt=""
src="Linux 系统内核的调试.files/image001.gif" width=450
border=0><BR>
<DIV><A name=IDAZTYMB>2.2 Kgdb的安装与设置</A></DIV>
<DIV>下面我们将以Linux 2.6.7内核为例详细介绍kgdb调试环境的建立过程。</DIV>
<DIV><B>2.2.1软硬件准备</B></DIV>
<DIV>以下软硬件配置取自笔者进行试验的系统配置情况:</DIV><BR><A
name=IDADUYMB><B></B></A><BR><IMG height=215 alt=""
src="Linux 系统内核的调试.files/table1.gif" width=589
border=0><BR>
<DIV>kgdb补丁的版本遵循如下命名模式:Linux-A-kgdb-B,其中A表示Linux的内核版本号,B为kgdb的版本号。以试验使用的kgdb补丁为例,linux内核的版本为linux-2.6.7,补丁版本为kgdb-2.2。</DIV>
<DIV>物理连接好串口线后,使用以下命令来测试两台机器之间串口连接情况,stty命令可以对串口参数进行设置:</DIV>
<DIV>在development机上执行:</DIV><BR><A
name=IDASUYMB><B></B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%"
bgColor=#eeeeee border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
stty ispeed 115200 ospeed 115200 -F /dev/ttyS0
</CODE></PRE></TD></TR></TBODY></TABLE><BR>
<DIV>在target机上执行:</DIV><BR><A
name=IDA0UYMB><B></B></A><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%"
bgColor=#eeeeee border=1>
<TBODY>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -