Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1634728
  • 博文数量: 197
  • 博客积分: 10046
  • 博客等级: 上将
  • 技术积分: 1983
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-07 12:36
个人简介

在外企做服务器开发, 目前是项目经理, 管理两个server开发的项目。不做嵌入式好久了。

文章分类
文章存档

2011年(2)

2010年(6)

2009年(18)

2008年(30)

2007年(100)

2006年(41)

分类: LINUX

2007-07-12 12:49:30

文件: Vmware5.5.1利用kgdb调试x86 平台kernel2.6.18.8.pdf
大小: 511KB
下载: 下载
进来有朋友说 ,那个下载patch的网站访问不了了 , 那几个patch 和我的 。config 已经附在 pdf的附件里面了。

 

更多的关于arm下用kgdb调试的讨论 可以参考 :   我在那里有更深入的讨论。

 

 

 

 

 

 现在已经可以用MultiICE 的majic-LT 来调试s3c2410的板子

 

利用Vmware5.5.1 kgdb调试 x86平台的kernel

 

 

 

AuthorBob Zhang

Mail

 

version: 0.1    2007-7-11

 

 

    今天终于可以通过Vmware 利用kgdb 调试x86 平台的2.6.18.8kernel 感觉就是爽啊 。 虽然 暂时还是不能用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 patchlinux kernel host端就是运行gdb的一端 。

两台pc 可以用串口线相连。 targetkernel 停止到某个断点上,等待着gdb连上来下指令。

我们可以用vmvare 虚拟出两台linux ,这样就省下了串口线。 具体设置参考下面的图。

 

试验的版本要求:

Linux Kernel:linux-2.6.18.8  

Vmware : 5.5.1 网上有破解版下载 ,要是6.0应该也可以吧, 我没有试验过。 Vmware4.0 不可以,它里面没有配置串口的选项。

HostLinux Redhat9.0

 

 

0,准备工作

 

0.1  vmware 虚拟两台linux   现在我们已经有了一个虚拟的redhat9.0linux 了,

只需要用vmvare自带的clone的功能,再clone一个就可以了。

 

Clone之前,要关闭虚拟的linux ,然后执行 VM->clone ,只需点击下一步就可以了。

 

小提示: 上面的方法最简单,就可以建立出另一个虚拟的linux 。如果你本身已经有两个了, 这步省略。

 

 

最后的效果如图:

 

 

02    配置两个虚拟机的串口连接, 达到什么效果那? 就好像两个linux 用串口连接起来一样。

具体设置:

àTarget 端:

 

 

 

Host端:

 

 

 

怎么确定 两个linux已经用串口连接起来了呢?

假设 两个虚拟机上都有一个好的redhat9.0 可以正常工作。 都已经启动了。

 

target端 执行 cat /dev/ttyS0

host 端 执行: echo 12345 > /dev/ttyS0

切换到target端, 看是否能看到 12345 ,看到了就说明串口连接没有问题。

 

-----

如果都没有问题了, 才可以继续向下作,否则重作。

 

03    host 端, 下载linux kernel 2.6.18.8 

为了叙述方便, 建立目录 /work/2.6   以后都会用到这个目录, 可以根据自己的需要更改。

 

     下载 kgdbpatch (当然是要适合2.6.18.8) , 事实上官方的kgdb的网站根本找不到

适合linux-2.6.18.8 ,所以到这里来找吧:

 

    下载kgdbpatch  /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

   0Serial 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就最好:比如我的host192.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 就没有警告了。 这个确实有人报告过错误, 但是也是不了了之了:

, 试着改一下还真行。

 

 

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.8kernel source code :

 

 

redhat9.0 升级到 2.6.18 可以参考这个文档。

 

这里给出比较详细的步骤:

 

但是这里的kernel版本是 2.6.7 ,  我们用的是 2.6.18.8  , 它对应的 kgdbpatch 可以到这里下载:

官方的patch 可以从这里得到:

但是似乎没有 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 , 应该就不用改了。

^_^, 这个问题也搞了我一天, 郁闷死了, 东查西查 ,才查到 这里:

阅读(8695) | 评论(15) | 转发(0) |
给主人留下些什么吧!~~

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

bob_zhang20042008-11-11 22:05:21

不好意思, 当时我也没有玩调试modules ,但应该也不难。

garyneville2008-11-11 12:26:36

Bob,我有一个问题,你应该在这个调试环境下使用了gdbmod来调试loadable module的吧,2.4下编译出来的内核模块文件应该是.o,但是target端运行的是2.6,支持的模块文件是.ko,这里有没有什么guide可以分享,非常感谢!