- 论坛徽章:
- 0
|
Author:Bob Zhang
Mail:
bob_zhang2004@163.com
bob.zhang2004@gmail.com
version: 0.1 2007-7-11
今天终于可以通过Vmware 利用kgdb 调试x86 平台的2.6.18.8的kernel 感觉就是爽啊 。 虽然 暂时还是不能用kgdb调试ARM 平台的jk2410,不过x86调通了,离成功还会远吗?
下面是个非常详细的配置过程,还有一些抓图, 确保你一次成功。 当然 你照着作不能成功 ,也是正常的,因为搞linux的都有这个常识,照着别人的作未必100%成功 。 这需要自己的独立思考和判断:自己的环境是否与文档的作者的环境是否相同,是否有一些常识性和基本的东西我没有提到。
照着文档作之前,还是要简单的google一下kgdb的工作原理和方式,可以参考下面几个链接:
这样能有助于理解 下面的做法:
要求几个前提:
l 熟练配置Vmware和使用 , 至少clone 要知道,怎么配置串口 。
l 在自己的redhat9.0 ,做过升级kernel到 2.6.18.8 ,至少可以正常工作。
l 知道linux 之间怎么样相互copy文件,可以用scp ,samba , ftp等等。
如果你上面都做过试验,下面的步骤就很轻松。
每个人的.config 可能不一样的。 为了能成功, 我附带了自己的 .config 。 以及下好的patch ,
以及打好了patch的的linuxkernel-2.6.18.8 ,如果偷懒的话,直接copy到自己的目录下就可以用了。
原理: kgdb 调试kernel 的原理,到网上google 。
一般性原理:需要两台pc ,都运行linux ,一个是target ,一个是host 。 target就是运行打了kgdb patch的linux kernel , host端就是运行gdb的一端 。
两台pc 可以用串口线相连。 target端kernel 停止到某个断点上,等待着gdb连上来下指令。
我们可以用vmvare 虚拟出两台linux ,这样就省下了串口线。 具体设置参考下面的图。
试验的版本要求:
Linux Kernel:linux-2.6.18.8
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.8.tar.bz2
Vmware : 5.5.1 网上有破解版下载 ,要是6.0应该也可以吧, 我没有试验过。 Vmware4.0 不可以,它里面没有配置串口的选项。
Host端Linux : Redhat9.0
0,准备工作
0.1 vmware 虚拟两台linux , 现在我们已经有了一个虚拟的redhat9.0的linux 了,
只需要用vmvare自带的clone的功能,再clone一个就可以了。
Clone之前,要关闭虚拟的linux ,然后执行 VM->clone ,只需点击下一步就可以了。
小提示: 上面的方法最简单,就可以建立出另一个虚拟的linux 。如果你本身已经有两个了, 这步省略。
最后的效果如图:
0.2 配置两个虚拟机的串口连接, 达到什么效果那? 就好像两个linux 用串口连接起来一样。
具体设置:
àTarget 端:
Host端:
怎么确定 两个linux已经用串口连接起来了呢?
假设 两个虚拟机上都有一个好的redhat9.0 可以正常工作。 都已经启动了。
在 target端 执行 cat /dev/ttyS0
在 host 端 执行: echo 12345 > /dev/ttyS0
切换到target端, 看是否能看到 12345 ,看到了就说明串口连接没有问题。
-----
!如果都没有问题了, 才可以继续向下作,否则重作。
0.3 在 host 端, 下载linux kernel 2.6.18.8
为了叙述方便, 建立目录 /work/2.6 以后都会用到这个目录, 可以根据自己的需要更改。
下载 kgdb的patch (当然是要适合2.6.18.8) , 事实上官方的kgdb的网站根本找不到
适合linux-2.6.18.8 ,所以到这里来找吧:
http://crypto.riken.go.jp/pub/linux/kernel.org/kernel/people/agk/patches/2.6/2.6.18/
下载kgdb的patch到 /work/2.6/kgdbpatch/ 目录中来。具体下载哪些patch ,请看下面patch命令涉及到的文件名。
解开kernel-2.6.18.8 ,把刚才的patch全打进去。注意patch的顺序,步骤如下:
Applying the kgdb patch
cd /work/2.6/linux-2.6.18.8
1. patch -p1 /work/2.6/kgdbpatch/core-lite.patch
2. patch -p1 /work/2.6/kgdbpatch/i386-lite.patch
3. patch -p1 /work/2.6/kgdbpatch/8250.patch
4. patch -p1 /work/2.6/kgdbpatch/eth.patch
5. patch -p1 /work/2.6/kgdbpatch/i386.patch
6. patch -p1 /work/2.6/kgdbpatch/core.patch
1, 编译kernel
à在 host端:
cd /work/2.6/linux-2.6.18.8
1.1 make menuconfig 选中kgdb相关的项
make menuconfig
根据你自己系统的需要自己选择编译哪些项目,条件是你的kernel能跑起来就行。
如果要支持kgdb ,务必确保选中下面的几项
kernel debugging
compile the kernel with debug info
kgdb ,kernel debugging with remote kgdb
console messages through gdb
Simple selection of KGDB Serial Port
(115200) debug serial baud rate
(0)Serial port number for KGDB
其他的应该就不用了,当然,你有需求可以选上。
我的供参考:
如果你不确定,或者图省事, 干脆把我附件中的.config copy到你的kernel根目录下,然后make menuconfig
,然后退出,save 。 即可。
1.2 修改编译参数, 必须有-g –O –ggdb
重要的一步:修改Makefile 里面的编译选项:
ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
CFLAGS += -O //原来是-Os 这个比 –O2 优化的还厉害呢
else
CFLAGS += -O2
Endif
…
ifdef CONFIG_DEBUG_INFO
CFLAGS += -g -ggdb
Endif
最后make bzImage && make modules
把 arch/i386/boot/bzImage 通过ftp或者samba或者scp copy 到 target 端的 /boot 目录,
并 改名为 vmlinuz-2.6.18.8
提示:用scp就最好:比如我的host:192.168.167.
把 System.map 通过ftp或者samba或者scp copy 到 target 端的 /boot 目录, 并 改名为
System.map-2.6.18.8
àTarget 端:
cd /boot
rm -rf System.map vmlinuz
ln -s System.map-2.6.18.8 System.map
ln -s vmlinuz-2.6.18.8 vmlinuz
修改grub.conf
最后的grub如下:
title Red Hat Linux (2.4.20-8)
root (hd0,0)
kernel /vmlinuz-2.4.20-8 ro root=LABEL=/
initrd /initrd-2.4.20-8.img
#上面是你的原来的,不要动 。 下面这个是要自己填写上去的。
title Red Hat Linux (2.6.18.8)
root (hd0,0)
kernel /vmlinuz-2.6.18.8 ro root=/dev/sda2 kgdbwait kgdb8250=0,115200
#initrd /initrd-2.4.20-8.img
Note: google的时候, 别的资料都说 应该这样写kgdbwait kgdb8250=0,115200
但是, 系统启动的时候, kernel会出警告, 说8250kgdb invalid ,后来我改成
kgdbwait 8250kgdb=0,115200 就没有警告了。 这个确实有人报告过错误, 但是也是不了了之了:
http://osdir.com/ml/kernel.debugging.kgdb.bugs/2006-03/msg00006.html
, 试着改一下还真行。
2,用vmware 调试
à在target端
配置好grub后,就可以重启了。就可以看到双启动了, 选择 2.6.18.8那个进入, 发现kernel停在那里了。
à在 host端
进入 /work/2.6/linux-2.6.18.8
执行:
gdb ./vmlinux
技巧:因为在linux的黑屏界面下,反复翻屏不是很方便, 所以 ,最好 ,利用sshclient 远程登陆linux ,在那里操作比较好了。
现在你就可以设置断点了,
比如 在初始化的过程, 我要在console_init()函数处停下来。
―――――――――――――――――――――――――――――――――――――――――――――――
参考的网站链接:
下面是我作的时候,参考的一些比较文档。在此非常感谢这些无私奉献的人 。
自己到网上下载 2.6.18.8的kernel source code :
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.8.tar.bz2
从redhat9.0 升级到 2.6.18 可以参考这个文档。
http://leftleg.hzpub.com/post/573.htm
这里给出比较详细的步骤:
http://kgdb.linsyssoft.com/quickstart.htm#mozTocId440917
但是这里的kernel版本是 2.6.7 , 我们用的是 2.6.18.8 , 它对应的 kgdb的patch 可以到这里下载:
http://crypto.riken.go.jp/pub/linux/kernel.org/kernel/people/agk/patches/2.6/2.6.18/
官方的patch 可以从这里得到:
http://kgdb.linsyssoft.com/downloads.htm
但是似乎没有 2.6.18 的patch
具体下载哪个patch 可以参照上面的一个链接里面说明。
具体用vmvare调试kernel , 可以参考这里的文档:
http://bbs.driverdevelop.com/htm_data/12/0704/101333.html
还可以参考这个更权威:
http://www.ibm.com/developerworks/cn/linux/l-kdb/
―――――――――――――――――――――――――――――――――――――――――――――――
Problem Diagnose
我碰到的问题的解决方式:
1> 为什么我的gdb 连不上 kgdb 呢?
当在host端执行 gdb ./vmlinux 的时候, 总是提示下面的错误:
Remote debugging using /dev/ttyS0
Ignoring packet error, continuing...
warning: unrecognized item "timeout" in "qSupported" response
Ignoring packet error, continuing...
Ignoring packet error, continuing...
Ignoring packet error, continuing...
Malformed response to offset query, timeout
注意:这里的 Serial port number for KGDB ,默认是1 , 所以你一定要改成 0 , 因为我们用的都是 ttyS0
如果你是用 ttyS1 , 应该就不用改了。
^_^, 这个问题也搞了我一天, 郁闷死了, 东查西查 ,才查到 这里:
http://blog.chinaunix.net/u/22617/showart.php?id=338509
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/31851/showart_699019.html |
|