本文讲述如何在两个主机之间搭建linux kernel的调试环境,用到kgdb工具。环境如下
gcc 4.6.3
ubuntu 3.13.0-32-generic
linux source code: linux-3.4.tar.gz
virtualbox 5.2.18
调试内核,当然首先需要编译自己需要的版本的内核,编译内核参数,make menuconfig. 当然,这里需要提前安装 ncurses 开发库,ubuntu 中安装方式如下
sudo apt-get install libncurses-dev
# or libncurses5-dev
如果不能正常安装,看下软件源正不正确,配置正确之后,sudo apt-get update
,然后再安装。
打开 make menuconfig 之后,首先当然是打开 KGDB。打开KGDB,首先需要在 “General setup” 中,打开"Prompy for development and/or incomplete code/drivers" (CONFIG_EXPERIMENTAL),然后在 “Kernel debugging” 中选择 “KGDB: kernel debugging with remote gdb”。当然,不同版本会有细微的差别,大家可以具体问题具体对待。网上内核编译参数很多,选择自己需要的参数,然后保存推出,此时,在当前文件夹下,会生成一个隐藏文件.config,这就是内核的编译参数。参数选定之后,开始编译
make -j 4
选择4个线程进行编译,可以自由选择。编译完成时,会生成 vmlinux 文件。
安装新编译的内核,成为当前Ubuntu的新内核。使用 root 权限,在之前编译好的linux 源码目录下执行
make modules_install # 安装新的内核镜像,同时更新grub
make install
update-grub
执行完 make modules_install
之后,会将新内核安装在 /boot
目录下,如果没有正确安装,执行上面后面两条指令,然后检查是否完成安装。安装完成之后,将 /etc/default/grub
文件中的下面两个参数注释掉
# GRUB_HIDDEN_TIMEOUT=0
# GRUB_HIDDEN_TIMEOUT_QUIET=y
如果不注释这两个参数,重启系统时,grub 直接启动原来的系统内核,不会进入选择页面,只有注释后,重启时,才能选择不同的内核版本。进入新内核版本之后,使用 uname -r
查看内核版本是否已经更新。OK, 此时,我们暂时完成了 target machine 的环境搭建。下面搭建 host machine 的环境。
将上面编译完成的 linux 源代码拷贝到 host machine中(正常情况下,只需要拷贝 vmlinux 文件即可),同时,设置串口 serial port. 在 virtual box 中设置串口方式如下。
在 target machine 中设置
在 host machine 中设置如下
target 先启动,host 才能正常通过串口连接,因为选择了 “Connect to existing pipe/socket”。当然,在设置串口连接之前,在 target 中还需要进行如下设置。在 /boot/grub/grub.cfg
文件中,对新版本的内核启动参数作一点修改
kgdbwait 在boot系统的时候,等待gdb连接, 通过ttyS0连接。然后重启系统。
启动 target machine 和 host machine,如下图所示
target machine 等待gdb连接。进入 host machine,然后进入编译好的linux源码目录。切换到 root 用户(只有root用户才有权限操作 /dev/ttyS0),然后使用gdb连接调试
gdb ./vmlinux
target remote /dev/ttyS0
连接正常后,就可以设置断点进行调试
至此,KGDB 调试环境搭建完成。搭建环境才是第一步,下面就是好好研究和学习了。
共勉。
本文使用 virtualbox 虚拟机搭建的环境,virtualbox 有一些坑,也给大家普及一下。
安装虚拟机,默认的网络模式NAT 模式,这种模式下,虚拟机的默认IP 是 10.0.0.2,能够上网,但是宿主机与虚拟机不能ping,改成 Bridge 桥接模式即可。
本文使用了两台虚拟机,当安装了一台虚拟机之后,另一台虚拟机直接clone 克隆即可,但是需要修改两台主机的MAC地址,不然两台虚拟机的IP相同就会出现问题。
如果安装系统的时候,出现 “FATAL: no boot media found, system halt”。检查setting->storage->controller 中的 optical driver 是不是 empty,如果是空,选择镜像文件。如果你安装的镜像文件是 ghost 版本的,那么仍然会出现这种问题,比如你在安装windows,那么就必须首先下载 PE 镜像文件,进入PE 之后在选择 ghost 的镜像文件进行安装才行。