用qemu+gdb tcp server+CDT调试linux内核启动-起步
用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内核启动-起步的更多相关文章
- 用virtualbox+模拟串口+CDT调试linux内核 TCP/IP协议栈-起步
经常有人问一台机器如何将hello经网络发送给另一台机器,我确实是不知道,只能看代码了. 说明:本人对内核的研究学习也是刚刚起步,有很多不了解的,所以文中可能会有一些"一本正经的胡扯&quo ...
- qemu通过命令行直接引导linux内核启动
qemu -kernel vmlinuz-3.14.0 -hda img_custom -append root=/dev/sda1
- 在qemu环境中用gdb调试Linux内核
简介 对用户态进程,利用gdb调试代码是很方便的手段.而对于内核态的问题,可以利用crash等工具基于coredump文件进行调试.其实我们也可以利用一些手段对Linux内核代码进行gdb调试,qem ...
- Gdb远程调试Linux内核遇到的Bug
知识共享许可协议本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/gdb-bug 本博客同步在http://www.cn ...
- 使用QEMU调试Linux内核代码
http://blog.chinaunix.net/uid-20729583-id-1884617.html http://www.linuxidc.com/Linux/2014-08/105510. ...
- 学习构建调试Linux内核网络代码的环境MenuOS系统
构建调试Linux内核网络代码的环境MenuOS系统 一.前言 这是网络程序设计的第三次实验,主要是学习自己编译linux内核,构建一个具有简易功能的操作系统,同时在系统上面进行调试linux内核网络 ...
- TCP/IP协议栈在Linux内核中的运行时序分析
网络程序设计调研报告 TCP/IP协议栈在Linux内核中的运行时序分析 姓名:柴浩宇 学号:SA20225105 班级:软设1班 2021年1月 调研要求 在深入理解Linux内核任务调度(中断处理 ...
- 用 kGDB 调试 Linux 内核
简介 这个文档记录了用kGDB调试Linux内核的全过程,都是在前人工作基础上的一些总结.以下操作都是基于特定板子来进行,但是大部分都能应用于其他平台. 要使用KGDB来调试内核,首先需要修改conf ...
- VELT-0.1.5开发:使用kgdb调试Linux内核【转】
转自:http://demo.netfoucs.com/lights_joy/article/details/44106589 VELT的全称是Visual EmbedLinuxTools,它是一个与 ...
随机推荐
- java-web项目:用servlet监听器实现显示在线人数
1.创建一个监听器 package com.listener; import javax.servlet.ServletContext; import javax.servlet.http.HttpS ...
- css hack 浏览器携带自身特有的属性 (二)
css hack 浏览器携带自身特有的属性,才是我们真正要解决的css 兼容问题. 这里只是分享思路. 举例子: 1 outline,尤其是一些 自带继承特性的属性.这里指的是 隐性的inherite ...
- Garmin APP开发之布局
上一章节介绍了garmin app开发的入门,包括garmin-sdk,开发工具的安装部署,文章结尾我们新建了我们的第一个app程序Garmin开发-入门: http://tieba.baidu.co ...
- jsp页面file标签上传图片以及blob类型数据库存取。
我的jsp页面表单如下: <form name="form1" action="/YiQu/AddUserServlet?jurisdiction=1" ...
- 一键部署基于SVN开源版本控制系统
https://market.azure.cn/Vhd/Show?vhdId=11889&version=12961 产品详情 产品介绍Subversion作为新一代的开源版本控制工具,Sub ...
- HTTP错误码汇总(转)
响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行.响应码分五种类型,由它们的第一位数字表示:1.1xx:信息,请求收到,继续处理2.2xx:成功,行为被成功地接受.理解和采纳3 ...
- [Git]常用的Git命令行
Commit的用法 git init [+项目名] git add . (注意这里在add后面的空格和点是不能省略的) git status git commit -m “message”(这里的me ...
- 爬去酷狗top500的数据
import requests from bs4 import BeautifulSoup import time headers={ #'User-Agent':'Nokia6600/1.0 (3. ...
- Ubuntu下安装XAMPP
来源:http://www.ido321.com/1265.html 最近,我也玩起了Linux了,瞬间觉得自己逼格又上去了,所以,就给笔记本安装了Ubuntu+Win7双系统.当然在Ubuntu下必 ...
- Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] B "Or" Game (贪心)
首先应该保证二进制最高位尽量高,而位数最高的数乘x以后位数任然是最高的,所以一定一个数是连续k次乘x. 当出现多个最高位的相同的数就枚举一下,先预处理一下前缀后缀即可. #include<bit ...