使用qemu进行内核源码级调试
更新时间:2024-05-22 12:36:01 阅读量: 综合文库 文档下载
- 如何使用Qemu推荐度:
- 相关推荐
使用qemu进行内核源码级调试
内核源码调试对于内核初学者而言是一件有一定难度的事.工欲善其事,必先利其器,要想成功地进行内核源码级的调试,首先,必须现找到一个合适的工具,下面,笔者就来介绍内核源码调试的一款工具QEMU.
QEMU是一个通用并开放源代码的模拟器,其功能相当的强大,例如:可以用QEMU来模拟一个完整的系统,同时,也可以用QEMU来实现系统源码级的调试.如果您想对QEMU仿真器有更加深入的了解,请参阅其官方网站: http://www.qemu.org/
下面笔者从如何得到QEMU,以及如何在linux下安装QEMU并进行源码级的调试做一个详细的介绍. (一) qemu的获得以及安装
得到qemu是相当方便的,到其官方网站
http://www.nongnu.org/qemu/download.html下载QEMU Linux 下载最新版本即可.
接下来是在linux下安装qemu的详细步骤: 第一步:
把下载的文件放到工作目录下,解压缩: 例如:
huanghucai@huanghucai-laptop:~/kernel_learning$ tar zxvf
qemu-0.10.5.tar.gz
第二步:切换到qemu目录下
huanghucai@huanghucai-laptop:~/kernel_learning$ cd qemu-0.10.5 第三步:配置安装
huanghucai@huanghucai-laptop:~/kernel_learning/qemu-0.10.5$ ./configure
huanghucai@huanghucai-laptop:~/kernel_learning/qemu-0.10.5$ sudo make
huanghucai@huanghucai-laptop:~/kernel_learning/qemu-0.10.5$ sudo make install
这样,qemu就安装好了,安装好了之后,对于一个新的软件,我们需要查看其具体的使用方法,那么请查看它的man手册.或者是到其官方网站去了解其基本的应用.
(二) 使用QEMU进行内核源码级调试
接下来,就是利用QEMU进行内核源码调试.要想在QEMU下进行内核源码调试,和其他内核调试方式一样,首先是准备内核镜像.为了能够进行源码级的跟踪、调试,需要一个包含调试信息的内核镜像.
下面将会以linux-2.6.23.2内核版本为例来进行讲解.
首先是到linux内核官方网站www.kernel.org获得linux-2.6.23.2内核源码linux-2.6.23.2.tar.gz,下载后解压缩,将源代码放到工作目录下, 例如:放到目录
huanghucai@huanghucai-laptop:~/kernel_learning$
(这里说点题外话,这里笔者推荐一款下载工具axel,下载速度很快的,为了尽快的得到源代码,安装axel,复制链接,之后终端执行下面命令: axel -n 50 -o .
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.23.2.tar.gz不过60秒,你就可以得到linux内核源码了,上面的.表示你把下载源代码放在了当前工作目录下,使用了50线程,要想对axel有深入的了解,你可以man一下就OK了)
下载内核源代码之后,解压缩,并进入内核源码目录:
huanghucai@huanghucai-laptop:~/kernel_learning$ tar zxvf linux-2.6.23.2 linux-2.6.23.2.tar.gz
huanghucai@huanghucai-laptop:~/kernel_learning$ cd linux-2.6.23.2
第一步、生成新的.config文件,其中的配置采用默认的选项就可以了
huanghucai@huanghucai-laptop:~/kernel_learning/linux-2.6.23.2$ defconfig
第二步、修改已有的.config文件,在这个步骤中,添加新的内核选项
huanghucai@huanghucai-laptop:~/kernel_learning/linux-2.6.23.2$ make memuconfig
进入顶级选项Kernel hacking选项,选中kernel debugging,之后再次选中Compile kernel with debug info选项,选择以后出来并保存就可以了;
第三步、创建大内核镜像bzImage
huanghucai@huanghucai-laptop:~/kernel_learning/linux-2.6.23.2$ make bzImage
第三步运行结束需要较长的时间,当第三步完成之后,如果没有出现什么问题,就可以直接略去下面的这些内容跳到第四步就OK了;如果你使用的是gcc 4.3,那么很有可能会出现创建失败的情况,错误提示如下所示: ...... ......
LD .tmp_vmlinux1
kernel/built-in.o: In function `getnstimeofday':
(.text+0x1b2b1): undefined reference to `__umoddi3' kernel/built-in.o: In function `do_gettimeofday':
(.text+0x1b36c): undefined reference to `__udivdi3' kernel/built-in.o: In function `do_gettimeofday':
(.text+0x1b38f): undefined reference to `__umoddi3'
kernel/built-in.o: In function `timekeeping_resume':
timekeeping.c:(.text+0x1b520): undefined reference to `__udivdi3' timekeeping.c:(.text+0x1b543): undefined reference to `__umoddi3'
kernel/built-in.o: In function `update_wall_time':
(.text+0x1bb9d): undefined reference to `__udivdi3' kernel/built-in.o: In function `update_wall_time':
(.text+0x1bbc0): undefined reference to `__umoddi3' kernel/built-in.o: In function `update_wall_time':
(.text+0x1bc57): undefined reference to `__udivdi3' kernel/built-in.o: In function `update_wall_time':
(.text+0x1bc81): undefined reference to `__umoddi3' make: *** [.tmp_vmlinux1] Error 1
这个错误的原因是因为gcc 4.3在处理64位整数运算的时候出现的问题,解决的办法据我所知有两种,这里介绍其中一种.在linux2.6.23.2目录下的Makefile文件中给变量CFLAGS_KERNEL赋值为:-fno-tree-scev-cprop, 改变值之后重新编译一次就OK了.如果出现了undefined reference to `__stack_chk_fail',可以在文件Makefile中的CFLAGS设置值 -fno-stack-protector,即关闭掉栈的保护.
如果出现其他编译失败的情况,你可以借助于google找到相关的解决方案.
第四步就是准备根文件系统镜像,这里我从qemu的官方网站下载了linux-0.2.img.bz2,解压缩并将解压缩后的文件放到源代码目录下.
经过上面四个步骤的工作,现在你已经将内核源码级的调试环境搭建完了,下一步就来进入qemu下的内核源码级调试.
(三) QEMU下内核源码级调试 首先是启动qemu:
可以运行类似于下面命令来启动qemu:
qemu -S -kernel arch/i386/boot/bzImage -hda linux-0.2.img -append \ 截图如下所示:
运行了此命令后就可以进行源码级的调试了. 当执行了上面的启动命令之后,会弹出下面的QEMU工作终端, 此时QEMU工作终端是一个黑色方框,没有任何内容, 现在要切换进QEMU,按下Ctrl+Alt+2即切换到QEMU工作台下.启动gdb
服务,并设置主机连接端口,使用下面命令即可实现: gdbserver 1234 这里要理解的一点是:当启动QEMU后,QEMU仿真器在等待着gdb的连接. 如图所示: 要在仿真器下进行源代码级的调试,需在另外一个终端下启动'vmlinux'调试,对应的命令为: gdb vmlinux.这些工作都是在源码目录下实现的。 之后,在调试状态下进行QEMU的连接: target remote localhost:1234 建立QEMU连接后,就可以进行gdb的正常使用了,例如,通过c命令启动内核 (gdb) c 参考:《linux2.6 内核标准教程》 河泰 王洪涛 编著 发表于: 2009-07-26 ,修改于: 2009-08-03 10:13,已浏览1846次,有评论9条 推荐 投诉
网友评论 内容我按照上面做了,还有一个问题是,: could not open gdbserver on device 1234? Blog作者的回复: 你可以改另外一个端口试试,例如gdbser 1212 本站网友评论于:2009-08-07 18:09:42 (221.237.191.★) 内容: 么原因吗。 Blog作者的回复: 这样的问题我也没有遇到过,在网上搜索了一下,可能是gdbserver启动失败,这个问题我暂时也解决不了,很抱歉. 我感觉不是端口的问题,我试了很多的端口,都是这种错误,能请教一下是什 本站网友评论于:2009-08-08 17:40:28 (125.71.127.★) 内容: qemu -S -kernel arch/i386/boot/bzImage -hda linux-0.2.img -append \我按照上面的作了,但是每次执行: root = dev/hda\。总是出现VNC server running on `127.0.0.1:5901', xucaiyi 评论于:2009-12-16 13:24:42 (218.9.122.★) 内容: 本站网友评论于:2010-03-05 09:53:23 (125.69.76.★) 这时候你可以通过一个VNC客户端连过去 内容我走到了最后一步。当我输入c时.屏幕显示Continuing : (如帖子最后一幅图显示的那样) 但是这之后,就没有别的反应了..接下来该怎么办呢? 本站网友评论于:2010-04-17 12:53:11 (192.55.46.★) 内容: 这么使用:gdbserver tcp::1234 可以解决你的问题 greek_zjb 评论于:2010-04-26 11:37:38 (61.135.165.★) 内容: 本站网友评论于:2010-11-05 09:49:35 (61.148.56.★) 还需要Ctrl+Alt+1切换回运行模式。 内容: 本站网友评论于:2011-03-12 13:44:34 (112.80.193.★) 怎么通过VNC客户端连过去?我也遇到提示VNC server ranning on .... 内容: 怎么通过VNC客户端连过去?我也遇到提示VNC server ranning on ....
本站网友评论于:2011-03-12 13:44:34 (112.80.193.★)
使用qemu进行内核源码级调试(错误解决办法):
操作平台:vmware6.0+ubuntu11.04+qemu-0.14.1+linux-2.6.23.2.tar.gz
1.defconfig命令不对,应该是make defconfig
2.make menuconfig错误,原因是缺少ncurses。 Ubuntu 安装ncurses,包的全称是libncurses5-dev sudo apt-get install libncurses5-dev
3.make bzImage之后提示以下错误信息: arch/i386/boot/boot.h: Assembler messages:
arch/i386/boot/boot.h:110: Error: bad register name `%dil' make[1]: *** [arch/i386/boot/video.o] Error 1 make: *** [bzImage] Error 2
对照错误提示在网上看到一个解决办法,将arch/i386/boot/boot.h文件中asm volatile(\
addr))中的r改为q,这样改后确实可以编译通过。(但是用新内核无法启动系统,参考网址:网址http://www.longene.org/forum/viewtopic.php?f=2&t=685 -->这个问题我没有发现)
4.调试方法:
打开一个终端,进入内核源码的目录,我的是~/kernel_learning/linux-2.6.23.2/,运行下面命令来启动qemu:
qemu -S -kernel arch/i386/boot/bzImage -hda linux-0.2.img -append \,注意不能是\,否则根文件系统
挂载不了,系统无法启动。-no-kqemu参数也不能用,因为系统不识别。
此时系统显示:VNC server running on `127.0.0.1:5900`,并没有出现文章中所说的QEMU工作终端的黑色方框。
网友评论中提到这时候你可以通过一个VNC客户端连过去,说明需要通过VNC客户端连过去。google发现VNC客户端命令是vncviewer,重新打开
一个终端,输入vncviewer,系统提示vncviewer未安装,按照系统提示安装一个,sudo apt-get install vncviewer就OK了。可以安装先一个sudo apt-get install vnc4server。
重新打开一个终端,进入内核源码的目录,输入vncviewer,系统提示Server: ,此时输入127.0.0.1:5900,连过去之后就可以看到QEMU工
作终端的黑色方框了,按下Ctrl+Alt+2即切换到QEMU工作台下.启动gdb服务,并设置主机连接端口,使用下面命令即可实现:
gdbserver tcp::1234 (注意不能是gdbserver 1234,否则系统报错:can not open device 1234),此时显示waitng for connect....
说明当启动QEMU后,QEMU仿真器在等待着gdb的连接。
重新打开一个终端,进入内核源码的目录,输入gdb vmlinux,之后,在调试状态下进行QEMU的连接:
target remote localhost:1234
建立QEMU连接后,就可以进行gdb的正常使用了,例如,通过c命令启动内核 (gdb) c
我走到了最后一步。当我输入c时.屏幕显示Continuing (如帖子最后一幅图显示的那样)
但是这之后,就没有别的反应了..接下来该怎么办呢? 答案是还需要Ctrl+Alt+1将QEMU切换回运行模式。
5. 安装qemu-0.14.1错误:zlib check failed, 原因是缺少 sudo apt-get install zlib1g-dev或者按下面步骤执行:
安装qemu-0.14.1会报错,确实zlib库,ubuntu系统默认没有zlib库,不能用apt-get install命令安装,从网上下载zlib-1.2.3.tar.gz,
解压后进入zlib-1.2.3,执行./configure; sudo make; sudo make install即可。
6.根文件系统linux-0.2.img是从qemu的官方网站上download的linux-0.2.img.bz2,解压命令时bunzip2 linux-0.2.img.bz2。
正在阅读:
使用qemu进行内核源码级调试05-22
对公司的建议 设计院员工个人工作总结及对公司的建议04-13
《鸡兔同笼》教学反思03-06
评山寨“狮身人面像”:没文化是“时代病”05-10
第三节 轻轨车站建筑设计06-02
建筑施工安全检查标准复习题(JGJ59-2011)-含答案_看图王07-21
歌曲版权合作合同协议范本模板09-15
民法分论复习笔记06-06
深山红叶WINPE工具箱嫦娥一号纪念07-25
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 内核
- 调试
- 源码
- 进行
- 使用
- qemu
- 技术在森林资源监测中的特点及发展趋势
- 2017咨询工程师继续教育PPP政策解析及制度建设试卷
- 伊利实业集团股份有限公司财务报表分析000
- 部编人教版版二年级语文上册期末专项归类复习试题及答案
- 只含有碳氢两种元素的化合物
- 城市轨道交通毕业论文
- 实验一:递归函数的设计与实现
- 二期高层脚手架方案
- 医务人员职业安全管理制度
- 《Java编程语言:原理与范例》课后实验源代码
- UML在线音乐系统
- 2015年北京师范大学博士生英语入学考试试题
- 《概率与统计》习题答案(复旦大学)
- 四川省中江县龙台中学2012-2013学年高一下学期期中考试试
- 探析优化高中思想政治课教学模式
- 四川成都体育馆扩声显示系统设计配置方案 - 图文
- 仁爱版七年级英语下册Unit7 Topic1 SectionD 精品教案
- 湖南师大附中2019届高三地理摸底考试试卷
- 基于Java 的网络音乐分享网站设计与实现
- 系统设置 优化大师一马当先