热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

使用gdb调试linux内核

使用Gdb+qemu调试内核:我们调试内核需要一个叫qemu的虚拟机,qemu虚拟的一个好处便是可以让cpu处于冻结状态,从而让操作系统处于暂停状态,这样我们才能很方便的调

使用Gdb+qemu调试内核:

我们调试内核需要一个叫qemu的虚拟机,qemu虚拟的一个好处便是可以让cpu处于冻结状态,从而让操作系统处于暂停状态,这样我们才能很方便的调试内核。 首先使用qemu安装一个操作系统,再将该操作系统的内核换成我们要调试的。

安装qemu:

在ubuntu10.10下用# sudo apt-get install qemu下载最新的qemu版本

从已经装好的操作系统ubuntu9.10_32.img的硬盘启动,测试qemu是否可以运行:

# qemu –hadubuntu9.10_32.img


基本安装结束后,开始进入调试阶段:

从http://www.kernel.org/pub/linux/kernel/v2.6/

下载linux2.6内核,本实验使用编译的内核为linux2.6.30

# cd/Downloads

#wget  http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.tar.bz2

# tar –jxvf  linux2.6.30.tar.bz2

# cdlinux-2.6.30

下面我们需要编译自己的内核,产生image文件bzImage和内核ELF文件vmlinux,具体的编译过程参考技术博客:http://www.cyberciti.biz/tips/compiling-linux-kernel-26.html

# make menuconfig

# make

编译后会在./arch/x86/boot/ 下生成bzImage文件:

注:编译时间很长,由于我没有对内核进行裁剪,以后编译时可以参考:

http://lamp.linux.gov.cn/Linux/kernel_options.html来对配置文件进行裁剪,对不需要的模块要进行裁剪,可以采用先剪裁几个模块后进行编译,没有错误后再进行裁剪编译,最大程度上上保持内核配置的正确性,在这方面必须要加强,不能拿来个内核全都编译,这样时间和空间都是种浪费。


运行qemu,启动调试模式:

# qemu –S–kernel arch/x86/boot/bzImage –had ubuntu9.10_32.img –append “root=dev/had”


在命令中使用S参数,是freeze CPU ata startup。

系统跳出一个黑显示界面,无任何内容,此时通过ctrl+alt+1与ctrl+alt+2可以切换,ctrl+alt+2是qemu控制台,ctrl+alt+1是屏幕输出。

现在我切换到qemu控制台(ctrl+alt+2)

(qemu)gdbserver 1234


此时需要另打开一个终端,进入linux2.6.30源码目录下:

# gdbvmlinux

(gdb)target remote localhost:1234


这时就可以正常使用gdb编译内核了

设置断点break start_kernel,停在linux内核的第一个c程序之上:











推荐阅读
author-avatar
沙楽33
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有