在外企做服务器开发, 目前是项目经理, 管理两个server开发的项目。不做嵌入式好久了。
全部博文(197)
分类: LINUX
2007-07-12 12:49:30
|
|
更多的关于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 , 应该就不用改了。
^_^, 这个问题也搞了我一天, 郁闷死了, 东查西查 ,才查到 这里:
wpneu2009-02-11 14:51:05
你好,按照你的步骤gbd已经能通信了,但是我执行continue后打算让target 上的kernel跑完,但是target一侧出现如下信息: VFS: Cannot open root device "sda3" or unknown-block(0,0) Please append a correct "root=" boot option Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) 内核停住了。 '/‘目录在sda3上 我的grub配置如下: title Red Hat Linux (2.6.18.8) root (hd0,0) kernel /vmlinuz-2.6.18.8 ro root=/dev/sda3 kgdbwait kgdb8250=0,115200 请教一下可能是什么原因呢? 我怀疑是我的.config配置有些地方不对,能不能把你的那个kgdb-config文件发给我一下,因为你的附件内的kgdb-config文件无法保存到
wpneu2009-02-07 11:22:35
你好 ,请教一下,我的虚拟机是6.5版本的,内核是2.6.18的,两个虚拟机(一个是clone的),串口是按照你那样的设置,但是执行 : 工作机: stty ispeed 115200 ospeed 115200 -F /dev/ttyS0 目标机: stty ispeed 115200 ospeed 115200 -F /dev/ttyS0 目标机: cat /dev/ttyS0 工作机: echo hello > /dev/ttyS0 就是不显示hello ,请问有可能是什么原因呢? (内核需要有相应的配置?还是别的问题呢 )先谢谢了
chinaunix网友2009-02-06 11:12:19
Bob,你好! 我有个关于内核调试的问题,昨天发了邮件给你。今天又正好搜索到你的博客。希望,你能指点一二,先谢谢了! 我的问题是:内核调试时不能查看其源代码,很是郁闷! ++++++++++++++++++++++++ [root@localhost alex]# gdb ./vmlinux GNU gdb Red Hat Linux (5.3post-0.20021129.18rh) Copyright 2003 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "sh
garyneville2008-11-11 12:26:36
Bob,我有一个问题,你应该在这个调试环境下使用了gdbmod来调试loadable module的吧,2.4下编译出来的内核模块文件应该是.o,但是target端运行的是2.6,支持的模块文件是.ko,这里有没有什么guide可以分享,非常感谢!