Linux是一个非常棒的操作系统, 很多Linux的爱好者, 都想深入的学习它, 市面上的工具也很多, 今天给大家介绍一下怎么用KGDB来调试kernel的方法.
1. 下载最新Linux内核
首先去Linux 官方网站 www.kernel.org 下载最新的内核源码, 现在最新的版本是4.0. 我们以4.2.8为例.
假设缺省工作目录为/home/linux/workspace
$ cd workspace
$ wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.2.8.tar.xz
$ tar -xvf linux-4.2.8.tar.xz
$ mv linux-4.2.8 linux
2. 配置内核选择
如果要使能kgdb调试进行调试, 需要使用KGDB over the serial console 作为与gdb通信模块。
$ cd linux
$ make defconfig
$ make menuconfig
选中 KGDB: use kgdb over the serial console 选项
General setup —>
Prompt for development and/or incomplete code/driversKernel hacking —>
Compile the kernel with debug info
Compile the kernel with frame pointers
KGDB: kernel debugger —>
<*> KGDB: use kgdb over the serial console
3. 编译kernel
我们可以使用 -j选项, 根据CPU数来进行并行编译,从而加快编译速度,如果机器CPU是双核4线程, -j后面跟上4.
如:
$ make -j4
如果想要保持linux目录的clear,将编译产生的二进制文件放到另一个目录下,请参考使用下面的命令:
$ mkdir obj
$ cd linux
$ make O=../obj defconfig
$ make O=../obj -j4
编译完成后,复制bzImage和vmlinux到工作目录下备用
$ cp arch/x86/boot/bzImage ~/workspace
$ cp vmlinux ~/workspace
4. 安装qemu
我们用的系统为ubuntu15.04. 也可以直接下载源码进行编译安装.
$ sudo apt-get install qemu
5. 用qemu启动Linux
用qemu启动我们刚刚编译的好的内核文件. 需要使用到根文件系统, 可以下载别人做好的, 也可以根据网上教程自己制作一个根文件系统.
$ qemu -kernel ~/workspace/bzImage -append &quot;root=/dev/sda&quot; -boot c -sda ~/workspace/busybox.img -k en-us
6. 启用KGDB
我们已经使用qume启动Linux系统了, 如果要使用kgdb需要在内核启动时增加参数. 当然也可以在内核启动后echo kgdboc模块的参数来重新设置参数. 这两种方式都可以, 在这里我们采用在内核启动时增加启动参数的方式:(kgdboc=ttyS0,115200 kgdbwait)
$ qemu -kernel ~/workspace/bzImage -append &quot;root=/dev/hda kgdboc=ttyS0,115200kgdbwait&quot; -boot c -sda ~/workspace/busybox.img -k en-us -serial tcp::5566,server
这时,运行qemu的终端将提示等待远程连接到本地端口4321:
QEMU waiting for connection on: tcp:0.0.0.0:4321,server
这时使用另外一个控制台执行:
$ gdb /usr/src/work/vmlinux(gdb) target remote localhost:4321
然后qemu就可以继续正常运行下去,最后停止内核,并显示如下信息:
kgdb: Waiting for connection from remote gdb…
这时gdb这边就可以看到如下的提示:
(gdb) target remote localhost:4321Remote debugging using localhost:4321kgdb_breakpoint () at kernel/debug/debug_core.c:983983 wmb(); /* Sync point after breakpoint */(gdb)
开始kernel的旅行吧!!!
注:和上面的**不同的是,它将qemu的虚拟串口导向到本地的一个”pty”设备上,而前面我们是导向到一个socket端口上.
qemu -serial参数介绍如下:
-serial devRedirect the virtual serial port to host character device dev. The default devices &quot;vc&quot; in graphical mode and &quot;stdio&quot; in non graphical mode. This option can based several times to simulate up to 4 serials ports.
如果gdb提示如下信息:
warning: Invalid remote reply:
可以使用Ctrl+C来终止当前gdb的操作,再次使用下面命令重新连接一次kgdb即可:
(gdb) target remote localhost:4321
参考:
http://kernel.org/pub/linux/kernel/people/jwessel/kgdb/
setting up kgdb using kvmqemu |