现在的位置: 首页 > 综合 > 正文

使用VMWare Workstation 6.0调试Linux Kernel

2013年07月27日 ⁄ 综合 ⁄ 共 1873字 ⁄ 字号 评论关闭
刚刚在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 6.0请到www.vmware.com官方下载。

三、调试:
   

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

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

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


  Code: [Copy to clipboard]  
(gdb) file vmlinux   //vmlinux就是从GUEST拷贝过来的内核映像文件
Reading symbols from /root/vmlinux...done.
Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) target remote localhost:8832  //注意,如果你的GUEST Linux是64位的,这里的localhost:8832就改成localhost:8864
Remote debugging using localhost:8832
[New thread 1]
0x000f4299 in ?? ()
warning: shared library handler failed to enable breakpoint

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

3.1 设置断点:

(gdb) b do_IRQ

Click Here to Open New Window

3.2 Continue和Step单步调试:

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

Click Here to Open New Window

3.3 清除断点,Continue

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

Click Here to Open New Window


3.4 gdb的quit命令

Click Here to Open New Window

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

这一调试原理, 是在WMware WS6.0的VP(虚拟处理器)的实现代码中, 添加了gdb stubs, 实现了一个标准的gdbserver。  WS6.0这么做的好处是, 只要HOST机器能运行gdb, 那么不管GUEST运行什么OS,都可以这么连接过去进行调试,对Solaris、MINIX、plan9、ReactOS等系统也是一样的(道理如此,但我没试验过)。  坏处就是,因为VP的实现对GUEST OS是完全透明的,所以GUEST OS如果发生panic,无法dump它的内核栈出来进行分析 -- 这一点比kgdb等专用的Linux调试工具差了很多。

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

如果想退出gdb调试, 且让GUEST机器正常运行,在使用quit命令之前先detach一下,不然就关机了。

抱歉!评论已关闭.