用qemu+gdb tcp server+CDT调试linux内核启动-起步

说明: 环境信息与 用virtualbox+模拟串口+CDT调试linux内核 TCP IP协议栈-起步 提到的一样,并且本文中会有很多个步骤与之相同,请参考。

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工具链。

sudo apt-get install gcc
sudo apt-get install build-essential

S5. 开发机安装qemu sudo apt-get install qemu

创建虚拟磁盘

创建rootfs

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

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.1 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
```shell S7. 在开发机上准备内核代码。
到[内核官网](https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/)下载你要用的内核,我的用的是[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.19 S8. 在开发机上准备编译安装内核。
修改Makefile文件(linux-4.4.19目录下),将其中的O2字样修改成O1,目前不支持O0编译。但是[有个文章](https://github.com/figozhang/runninglinuxkernel_4.0)说可以通过修改内核代码达到使用O0编译的目的。我试了试,没成功。如果谁成功了,可以告诉我,谢谢。
安装必要的依赖:
```shell
sudo apt-get install libncurses5-dev
sudo apt-get install libssl-dev
sudo apt-get install bc

调试目标机安装build工具链。

sudo apt-get install gcc
sudo apt-get install build-essential

配置内核选项,其实只需要执行这步生成config文件,配置项不用修改,我们要的都有。

make menuconfig

然后选择 exit 然后选择yes 生成config文件。

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这些快捷键都可以用。

用qemu+gdb tcp server+CDT调试linux内核启动-起步的更多相关文章

  1. 用virtualbox+模拟串口+CDT调试linux内核 TCP/IP协议栈-起步

    经常有人问一台机器如何将hello经网络发送给另一台机器,我确实是不知道,只能看代码了. 说明:本人对内核的研究学习也是刚刚起步,有很多不了解的,所以文中可能会有一些"一本正经的胡扯&quo ...

  2. qemu通过命令行直接引导linux内核启动

    qemu -kernel vmlinuz-3.14.0 -hda img_custom -append root=/dev/sda1

  3. 在qemu环境中用gdb调试Linux内核

    简介 对用户态进程,利用gdb调试代码是很方便的手段.而对于内核态的问题,可以利用crash等工具基于coredump文件进行调试.其实我们也可以利用一些手段对Linux内核代码进行gdb调试,qem ...

  4. Gdb远程调试Linux内核遇到的Bug

    知识共享许可协议本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/gdb-bug 本博客同步在http://www.cn ...

  5. 使用QEMU调试Linux内核代码

    http://blog.chinaunix.net/uid-20729583-id-1884617.html http://www.linuxidc.com/Linux/2014-08/105510. ...

  6. 学习构建调试Linux内核网络代码的环境MenuOS系统

    构建调试Linux内核网络代码的环境MenuOS系统 一.前言 这是网络程序设计的第三次实验,主要是学习自己编译linux内核,构建一个具有简易功能的操作系统,同时在系统上面进行调试linux内核网络 ...

  7. TCP/IP协议栈在Linux内核中的运行时序分析

    网络程序设计调研报告 TCP/IP协议栈在Linux内核中的运行时序分析 姓名:柴浩宇 学号:SA20225105 班级:软设1班 2021年1月 调研要求 在深入理解Linux内核任务调度(中断处理 ...

  8. 用 kGDB 调试 Linux 内核

    简介 这个文档记录了用kGDB调试Linux内核的全过程,都是在前人工作基础上的一些总结.以下操作都是基于特定板子来进行,但是大部分都能应用于其他平台. 要使用KGDB来调试内核,首先需要修改conf ...

  9. VELT-0.1.5开发:使用kgdb调试Linux内核【转】

    转自:http://demo.netfoucs.com/lights_joy/article/details/44106589 VELT的全称是Visual EmbedLinuxTools,它是一个与 ...

随机推荐

  1. Echarts获取数据绘制图表

    这次是利用mui框架实现一个手机移动端的项目.基本的框架已经实现,主要来获取数据实现一个图表的展示. 首先引入插件:echarts.js <script src="../resourc ...

  2. 深度探索C++对象模型——关于对象

    引言 以前读<C++ Primer>的时候一直有一种感觉:该书虽然是C++入门书籍,初学者读之却觉晦涩,越往后读越是如此.等到稍加理解后再读该书,顿感醍醐灌顶,茅塞顿开.究其原因,在于原作 ...

  3. POJ 1185 炮兵阵地 (状压DP,轮廓线DP)

    题意: 给一个n*m的矩阵,每个格子中有'P'或者'H',分别表示平地和高原,平地可以摆放大炮,而大炮的攻击范围在4个方向都是2格(除了自身位置),攻击范围内不能有其他炮,问最多能放多少个炮?(n&l ...

  4. 【转】 iOS学习之NSBundle介绍和使用

    bundle是一个目录,其中包含了程序会使用到的资源.这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in).对应bundle, cocoa提供了类NSBun ...

  5. SC || 解决在git中上传过大文件的问题(如何将提交过的彻底删除

    就在我在ddl前续命的时候……不知道怎么想不开,把v2的压力测试的日志(500多M)也往github上传 之前听说过好多因为传了大文件的锅…… 我竟然还想不开的往上传…… 真实又傻又蠢又自闭(T T ...

  6. MySql数据库中where的使用

    SELECT * from runoob_tbl WHERE runoob_author='菜鸟教程'; MySQL 的 WHERE 子句的字符串比较是不区分大小写的. 你可以使用 BINARY 关键 ...

  7. Render渲染函数和JSX

    1.Render函数:render是用来替换temlate的,需要更灵活的模板的写法的时候,用render. 官网API地址:https://cn.vuejs.org/v2/guide/render- ...

  8. NSString 使用 copy、strong

    // 首先定义2个属性 @property (nonatomic, strong) NSString *stStr; @property (nonatomic, copy) NSString *coS ...

  9. Where do I belong-freecodecamp算法题目

    Where do I belong(数组排序并找出元素索引) 要求 给数组排序 找到指定的值在数组的位置,并返回位置对应的索引. 思路 设定.sort()需要的返回函数 将要搜索的值添加到数组内 用. ...

  10. html页面简单访问限制

    PS:突然发现博客园有密码保护功能,已经可以满足基本需求了.博客园还能备份自己的所有数据,做到了数据归用户所有,平台只是展示,真是良心网站,大赞. 想要通过一个站点放一些东西给一些人看,但是又不想让所 ...