免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1196 | 回复: 0
打印 上一主题 下一主题

利用Vmware5.5.1 和 kgdb调试 x86平台的kernel [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-22 15:28 |只看该作者 |倒序浏览

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
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP