Chinaunix首页 | 论坛 | 博客
  • 博客访问: 613035
  • 博文数量: 152
  • 博客积分: 2684
  • 博客等级: 少校
  • 技术积分: 1126
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-29 11:03
文章分类
文章存档

2012年(6)

2011年(96)

2010年(50)

分类: LINUX

2011-05-18 15:05:36

本文由albcamus 在论坛所发,CU技术文章加以整理。供大家学习。

刚刚在LKML上看到的。可以做到C源代码级别的内核单步调试,真是简单的无以复加了。  如果不存在LICENSE方面的考虑, 我觉得UML(User Mode Linux)已经可以抛弃了。


一、环境:

    1, 一台Linux机器, 用于运行gdb和VMWare Workstation 6.0, 我们称之为HOST机器。
    2, VMWare6.0中安装一个Linux系统, 我们称这个Linux系统为GUEST机器, 它运行被调试的内核。


二、设置:

    很简单,在你的HOST Linux中,往GUEST Linux的vmware配置文件(即后缀名为.vmx的文件)追加一个字符串。 在我的机器上是这样的:

    # echo "debugStub.listen.guest32=1" >> /root/vmware/FC4\ Linux/FC4\ Linux.vmx

注译, 如果你是的GUEST是在x86-64上运行的, 那么把上面这行的就是debugStub.listen.guest64=1



补充:vmware ws 6.0尚未正式发布, 请到这里下载:

三、调试:
   




1, 把GUEST Linux上的内核映像文件(vmlinux)和内核源代码拷贝到HOST机器上。
  
    为了能够用gdb的list命令显示源代码, 看看GUEST机器上的/lib/modules//source (以下简称source) 和/lib/modules//build (以下简称build)这两个符号链接各自指向哪里(注:如果编译内核时没有用O=选项指定输出的路径,那么这两个符号链接就指向同一个路径,通常是/usr/src/linux-2.x.xx)。拷贝到HOST机器上相应的路径上。
    提醒: 编译内核之后build目录下会有很多临时文件, 有上G之大, 可以先把build目录下的vmlinux拷贝到HOST机器上, 然后进入source目录, 运行:
    make O=/lib/module//build clean
    然后再把build和source拷贝到HOST机器上。



2, 启动安装在VMWare中的GUEST Linux。
   

3, 在HOST机器上运行gdb, 进行调试:

作为例子,下面是几个调试动作:

3.1 设置断点:

(gdb) b do_IRQ

3.2 Continue和Step单步调试:

可以看出, gdb运行一下step命令, GUEST Linux就往下执行一句;否则就停着

3.3 清除断点,Continue

没有断点了, continue命令之后GUEST Linux就会正常的跑下去了。

3.4 gdb的quit命令



可见, 在gdb中quit了被调试程序, GUEST Linux就关机了。


VMWare Workstation 6.0真是个好东西, 推荐!

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

ipeter2011-07-17 14:58:13

只是利用了gdb的远程调试功能吧?理论上任何联网的物理机器和任何版本的虚拟机应该都可以吧?

chenjintao_ii2011-05-19 16:34:05

好吧,我承认我看了两遍之后还是不怎么懂。。。可能以后学着调一下程序就会懂的