刚刚在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, 一台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, 进行调试:
作为例子,下面是几个调试动作:
3.1 设置断点:
(gdb) b do_IRQ
3.2 Continue和Step单步调试:
可以看出, gdb运行一下step命令, GUEST Linux就往下执行一句;否则就停着
3.3 清除断点,Continue
没有断点了, continue命令之后GUEST Linux就会正常的跑下去了。
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] | |
|
3.1 设置断点:
(gdb) b do_IRQ
可以看出, gdb运行一下step命令, GUEST Linux就往下执行一句;否则就停着
没有断点了, continue命令之后GUEST Linux就会正常的跑下去了。
3.4 gdb的quit命令 可见, 在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一下,不然就关机了。 |