用qemu+gdb tcp server+CDT调试linux内核启动-起步
说明: 环境信息与 用virtualbox+模拟串口+CDT调试linux内核 TCP IP协议栈-起步 提到的同样,而且本文中会有不少个步骤与之相同,请参考。java
S1. 开发机:我是将一个老的索尼的笔记本装了Ubuntu桌面版本做为开发环境,版本号是Ubuntu 16.04.4 LTS,后面在某些步骤中也会称之为host。
S2. JDK使用的是java version "1.7.0_80"。 官网也有下载。后面CDT开发工具要用。
S3. Eclipse版本 Mars.2 Release (4.5.2),CDT(8.8.1)使用的插件的方式安装的。 相关软件在eclipse官网都可以得到。至于怎么装插件,请网上搜索。
S4. 开发机安装build工具链。linux
sudo apt-get install gcc sudo apt-get install build-essential
S5. 开发机安装qemu sudo apt-get install qemu
建立虚拟磁盘
建立rootfsgit
dd if=/dev/zero of=rootfs.img bs=1M count=10 mkfs.ext3 rootfs.img mkdir rootfs sudo mount -t ext3 -o loop rootfs.img rootfs cd rootfs/ sudo mkdir dev proc sys
S6. 编译安装busybox到rootfs
```shell
cd ~
mkdir 04.busybox
cd 04.busybox/
wget https://busybox.net/downloads/busybox-1.25.1.tar.bz2
tar -xjvf busybox-1.25.1.tar.bz2
cd busybox-1.25.1github
make menuconfig
配置编译采用静态连接
BusyboxSettings->Build options->BuildBusybox as a static binary
sudo make install CONFIG_PREFIX=/home/simon/005.vm/01.qemu/rootfs
cd 005.vm/01.qemu
sudo umount rootfs
```shellshell
S7. 在开发机上准备内核代码。
到内核官网下载你要用的内核,个人用的是[4.4.19]版本(https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.4.19.tar.gz)。能够用wget xxx内核连接地址的办法下载,个人是:
```shell
cd ~
mkdir 004.code
cd 004.code
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.4.19.tar.gz
tar -xzvf linux-4.4.19.tar.gz
cd linux-4.4.19app
S8. 在开发机上准备编译安装内核。
修改Makefile文件(linux-4.4.19目录下),将其中的O2字样修改为O1,目前不支持O0编译。可是有个文章说能够经过修改内核代码达到使用O0编译的目的。我试了试,没成功。若是谁成功了,能够告诉我,谢谢。
安装必要的依赖:eclipse
sudo apt-get install libncurses5-dev sudo apt-get install libssl-dev sudo apt-get install bc
调试目标机安装build工具链。tcp
sudo apt-get install gcc sudo apt-get install build-essential
配置内核选项,其实只须要执行这步生成config文件,配置项不用修改,咱们要的都有。工具
make menuconfig
而后选择 exit 而后选择yes 生成config文件。oop
make CONFIG_DEBUG_SECTION_MISMATCH=y -j2
此步骤须要很长时间,2-5小时不等,正常能够在睡觉前执行,次日早上起来看结果。
编译成功后,在你的linux-4.4.19目录/arch/x86_64/boot/bzImage 这个文件,后面启动会用
S9. 验证
qemu-system-x86_64 -kernel 004.code/linux-source-4.4.19/arch/x86_64/boot/bzImage -hda ~/005.vm/01.qemu/rootfs.img -append "root=/dev/sda"
能成功启动便可。
S10. 建立CDT工程
打开装了CDT插件的eclipse。
window-->preferences-->General-->Workspace 去掉勾选 Build Automatically。
window-->preferences-->C/C++-->indexer 去掉勾选 Enable indexer。
file-->new-->c project-->project name填写你本身合意的,好比linux-kernel-study / 去掉use default location,location输入框中选择你的linux-4.4.19路径。 / project type 选择 Makefile project-Empty project / Toolschains选择Linux GCC-->next-->Advanced Setting-->C/C++ Build-->去掉勾选use default build command, build command输入框内写上 make CONFIG_DEBUG_SECTION_MISMATCH=y -j2,build directory选择你的linux-4.4.19路径。 / Behavior页签 Build(Increament build) 输入框中输入一个空格便可。而后完成工程建立便可。
点击工具栏中的绿色小虫子右边的箭头,选择Debug Configurations-->C/C++ Remote Application(双击)-->proiect选择你刚建立的project / C/C++ Application选择你的linux-4.4.19路径下的vmlinux。 / 选中 Disable auto build 点击select other换一个启动器 选择 GDB(DSF)Manual Remote Debugging...
点击debugger页签 stop on startup at 填写start_kernel,点击connection子页签,type选择TCP,hostname填写localhost,prort number填写1234 。此处标志为待填13.1。
点击apply close便可。
S11. 修复GDB问题
后面步骤用gdb远程调试时会报错: Remote ‘g’ packet reply is too long
先看下您的gdb的版本,而后下载相同版本进行修复并并编译。
gdb -version wget http://ftp.gnu.org/gnu/gdb/gdb-7.11.1.tar.gz tar -xzvf gdb-7.11.1.tar.gz cd gdb-7.11.1 vi gdb/remote.c
将下面两行注释掉
// if (buf_len > 2 * rsa->sizeof_g_packet) // error (_("Remote 'g' packet reply is too long: %s"), rs->buf);
sudo ./configure sudo make sudo make install
S12. 启动调试目标机并调试
qemu-system-x86_64 -s -S -kernel 004.code/linux-source-4.4.19/arch/x86_64/boot/bzImage -hda ~/005.vm/01.qemu/rootfs.img -append "root=/dev/sda"
cd 你的linux-4.4.19路径
gdb vmlinux
target remote localhost:1234
此时就应该链接上目标机器了。
b start_kernel
按gdb的c指令即可以使得调试目标机继续启动下去。
执行到内核启动时,断点便会被命中。
S13. 在开发机用CDT调试。 从新启动调试目标机,此次不用gdb命令行的方式,用CDT可视化界面。 点击CDT工具栏中的绿色小虫子右边的箭头,选择1New_configuration,若是有什么错误提示不用理会,继续proceed。 链接成功后,控制台会有输出,也能够在控制台输入gdb调试指令,也能够在CDT上直接加断点。 这时你会发如今 start_kernel处停了下来。 F5 F6这些快捷键均可以用。