一种比较方便的调试内核的方法

2009-05-13 11:56:09来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

原理概述
所谓调试,这里指的是debug,是系统有问题需要查找问题原因。怎么查找问题呢,最简单的办法,看看运行在某几个时刻的系统是什么状态,这些状态是怎么
转换的,为什么有问题,改改状态看有什么效果。那么什么是系统的状态呢,我认为比较土的说,就是cpu的状态(比如寄存器的状态),
[url=javascript:;]内存[/url]
的状态(比如一些
变量的状态)。所以,简单的说,土土的说,调试,debug,就是在系统运行的时候查看(修改)系统状态。debug的方法,最简单的就是print,这
是最有效最直接的方法,不过,如果想多看几个状态,那就要添加代码,编译,重新运行,很繁琐。比较简洁的方法是使用类似gdb的工具,在运行时按照实际需
要查看各个状态。
对于运行在虚拟机上的系统,我们有机会通过虚拟机提供的接口查看整个虚拟机的状态,自然包括运行的系统的状态,比如,
[url=javascript:;]QEMU[/url]
与VMware都提供了这种接口,他们接口对外通信的协议是gdb的远程调试协议。
GDB的远程调试
具体的协议内容可以通过 info gdb 在Remote Protocol部分找到。简单的说,这个协议主要提供了查看(修改)寄存器(内存)等方法。 gdb通过这个协议获得(修改)运行时被调试系统的状态。通过这个协议与gdb合作的另一端称之为gdbstub。
虚拟机内置的gdbstub
QEMU与VMware通过内置的gdbstub与gdb通信,从而我们可以在系统的运行时通过gdb来查看(修改)系统的状态,而且,gdb可以进行源码级的调试,那么,日子就更好过了。
优点
在理想状态下,如果虚拟机没有bug(当然是不可能的),我们通过gdb能像调试普通的应用程序那样调试
[url=javascript:;]内核[/url]
,还是源码级的,方便,明了。实际上,虽然现
在QEMU对gdbstub的支持一塌糊涂(VMware没实际尝试过),但是,我们仍然能享受到部分的方便,比如,部分源码级的调试(设置断点,查看结
构体内容,局部变量内容等),如果内核没有打开中断,我们还可以单步执行,等等。
操作步骤安装QEMU

[url=javascript:;]root[/url]
用户到/usr/ports/qemu-devel 执行
[url=javascript:;]make[/url]
install就可以了。
[url=javascript:;]ports[/url]
中的qemu对amd64下的gdbstub是不支持的,但是cvs中最新的代码看上去已经支持amd64,所以,如果想用来调试
amd64系统,最好先make patch然后把cvs上的部分代码合并进来,然后make
install。合并的代码不多,在gdbstub.c中cpu_gdb_read_registers函数内。因为这么做不能保证一定工作,所以这里不
详细介绍。而且,随着ports更新,这个工作应该以后就不需要了。
建立用于调试的基本系统与内核
首先找到你的代码树,比如,我们在 /mnt/fb1/oskernel/fbcur/src
下保存最新代码,确定编译时的中间文件放到/mnt/fb1/cross-dev/fbcurobjs/
最后的系统在/mnt/fb1/fbcurmin/
(注意,这里的目录只是用于举例,你可以自由选择目录结构),那么首先buildworld,虽然我的pc是amd64但是因为qemu支持的问题,我希
望调试i386系统,所以我用下面命令来buildworld
$exportMAKEOBJDIRPREFIX=/mnt/fb1/cross-dev/fbcurobjs
$ makeTARGET=i386DESTDIR=/mnt/fb1/fbcurmin buildworld
$ makeTARGET=i386DESTDIR=/mnt/fb1/fbcurminKERNCONF=VBOX buildkernel
$ su
Password:
# makeTARGET=i386DESTDIR=/mnt/fb1/fbcurmin installworld
# makeTARGET=i386DESTDIR=/mnt/fb1/fbcurminKERNCONF=VBOX installkernel

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:NetBSD PBR 引导的函数调用关系图(FFSV2 文件系统)

下一篇:Gxemul简介