分类: C/C++
2008-06-23 15:33:17
|
|
更多的关于arm下用kgdb调试的讨论 可以参考 : 我在那里有更深入的讨论。
现在已经可以用MultiICE 的majic-LT 来调试s3c2410的板子
利用Vmware
Author:Bob Zhang
Mail:
version: 0.1
今天终于可以通过Vmware 利用kgdb 调试x86 平台的
下面是个非常详细的配置过程,还有一些抓图, 确保你一次成功。 当然 你照着作不能成功 ,也是正常的,因为搞linux的都有这个常识,照着别人的作未必100%成功 。 这需要自己的独立思考和判断:自己的环境是否与文档的作者的环境是否相同,是否有一些常识性和基本的东西我没有提到。
照着文档作之前,还是要简单的google一下kgdb的工作原理和方式,可以参考下面几个链接:
这样能有助于理解 下面的做法:
要求几个前提:
l 熟练配置Vmware和使用 , 至少clone 要知道,怎么配置串口 。
l 在自己的redhat9.0 ,做过升级kernel到
l 知道linux 之间怎么样相互copy文件,可以用scp ,samba , ftp等等。
如果你上面都做过试验,下面的步骤就很轻松。
每个人的.config 可能不一样的。 为了能成功, 我附带了自己的 .config 。 以及下好的patch ,
以及打好了patch的的linuxkernel-
原理: kgdb 调试kernel 的原理,到网上google 。
一般性原理:需要两台pc ,都运行linux ,一个是target ,一个是host 。 target就是运行打了kgdb patch的linux kernel , host端就是运行gdb的一端 。
两台pc 可以用串口线相连。 target端kernel 停止到某个断点上,等待着gdb连上来下指令。
我们可以用vmvare 虚拟出两台linux ,这样就省下了串口线。 具体设置参考下面的图。
试验的版本要求:
Linux Kernel:linux-
Vmware :
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
为了叙述方便, 建立目录 /work/2.6 以后都会用到这个目录, 可以根据自己的需要更改。
下载 kgdb的patch (当然是要适合
适合linux-
下载kgdb的patch到 /work/2.6/kgdbpatch/ 目录中来。具体下载哪些patch ,请看下面patch命令涉及到的文件名。
解开kernel-
cd /work/2.6/linux-
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-
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
(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-
提示:用scp就最好:比如我的host:192.168.167.
把 System.map 通过ftp或者samba或者scp copy 到 target 端的 /boot 目录, 并 改名为
System.map-
àTarget 端:
cd /boot
rm -rf System.map vmlinuz
ln -s System.map-
ln -s vmlinuz-
修改grub.conf
最后的grub如下:
title Red Hat Linux (
root (hd0,0)
kernel /vmlinuz-
initrd /initrd-
#上面是你的原来的,不要动 。 下面这个是要自己填写上去的。
title Red Hat Linux (
root (hd0,0)
kernel /vmlinuz-
#initrd /initrd-
Note: google的时候, 别的资料都说 应该这样写kgdbwait kgdb8250=0,115200
但是, 系统启动的时候, kernel会出警告, 说8250kgdb invalid ,后来我改成
kgdbwait 8250kgdb=0,115200 就没有警告了。 这个确实有人报告过错误, 但是也是不了了之了:
, 试着改一下还真行。
2,用vmware 调试
à在target端
配置好grub后,就可以重启了。就可以看到双启动了, 选择
à在 host端
进入 /work/2.6/linux-
执行:
gdb ./vmlinux
技巧:因为在linux的黑屏界面下,反复翻屏不是很方便, 所以 ,最好 ,利用sshclient 远程登陆linux ,在那里操作比较好了。
现在你就可以设置断点了,
比如 在初始化的过程, 我要在console_init()函数处停下来。
―――――――――――――――――――――――――――――――――――――――――――――――
参考的网站链接:
下面是我作的时候,参考的一些比较文档。在此非常感谢这些无私奉献的人 。
自己到网上下载
从redhat9.0 升级到
这里给出比较详细的步骤:
但是这里的kernel版本是
官方的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 , 应该就不用改了。
^_^, 这个问题也搞了我一天, 郁闷死了, 东查西查 ,才查到 这里: