linux内核调试: qemu + eclipse 组合

本文介绍如何使用Eclipse和QEMU进行Linux内核源码的编译与调试。通过详细步骤展示了配置Eclipse环境、设置编译命令及调试参数的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 linux内核源码阅读工具

      windows下当然首选source insight, 但是linux下就没有source insight这么优秀的工具了,但是也有不少的替代品,但觉绝对部分人会选择vim+ctags+cscope的组合,还有部分人或选择wine中的source insight或选择navigatror,当然对于代码阅读来说vim+ctags+cscope的组合还是比较好的一个选择方案,但是,当我使用了eclipse之后,个人感觉用eclipse作为linux环境下源码阅读工具确实比vim+ctags+cscope的组合方便很多。

     下面是linux环境下eclipse的配置安装方案:

      eclipse下载地址:http://eclipse.org/downloads/?osType=linux

      eclipse环境配置方案:http://forum.ubuntu.org.cn/viewtopic.php?t=183803

二 eclipse + qemu 进行linux源码的编译和调试

       最初调试内核采用了qemu + insight 或qemu + ddd的组合,相比来说insgiht的界面更加有好些,但是ubuntu 10.04以上的版本,删除了对Insight的默认支持,只能下载insight的源码编译安装,而且insight更新非常慢。 很久以前就看到有人用eclipse + qemu进行linux内核源码的编译和调试,这次终于抽了个时间尝试一下,毕竟eclipse的debugger是非常强大的。

      工具组合: Eclipse IDE for C/C++ Linux Developers  + qemu-0.12.3 (最好用kvm, 不幸的是机器太旧,不支持硬件虚拟化)

 

 

1.首先我们要从www.kernel.org下载内核源码,在这里我选择的是 linux-2.6.32.tar.bz2。我将其下载到我的主目录下,然后在terminal下输入以下命令。

$ cd (回到主目录)

$ tar xf linux-2.6.32.tar.bz2 (解压源码)

$ mkdir linux-2.6.32-obj (创建一个编译内核的目标文件输出目录)

$ cd linux-2.6.32 (进入内核源码树根目录)

$ make O=~/linux-2.6.28-obj menuconfig (这里我们要配置内核,并在~/linux-2.6.32-obj目录下生成内核配置文件.config)

$ make mrproper 

 

2. 接下来我们打开elicpse,第一次打开时有一个欢迎画面,

我们单击右边的workbench图片关掉欢迎画面。由于eclipse cdt是一个非常强大的c/c++ ide,它默认会自动的解析工程中源程序并编译工程和产生智能提示信息。但由于我们调试内核过程中暂不会用到这些功能,所以要关闭他们。

首先我们到Window->Preferences->General->Workspace 中将Build Automatically选项去掉。

 然后到Window->Preferences->C/C++ -> Indexer中,将默认的Fast c/c++ indexer改为No indexer。

 然后我们开始创建一个新的工程。

 从菜单中选择File -> New -> Project... -> C/C++ -> C Project 然后单击Next按钮。

 这时出现一个对话框,在Project Name 一栏填入一个工程名,比如 linux-kernel. 然后将 Use default location 选项给勾掉。在Location一栏填入刚才解压的内核源码的路径。Project type选择Makefile project -> Empty project。Toolchains 选择 Linux GCC.最终结果如下图所示:

然后单击Next按钮,出现下一个对话框。这时候因为工程的默认配置还不完全符合我们的要求。所以我们单击 Advanced Settings 按钮会打开一个工程配置对话框。我们选择左侧的 C/C++ Build 选项,在相应的右侧页面里我们将Builder Settings 选项页下的 Use default build command 勾选掉,然后指定一个新的Build command 为 make O=/home/xxx/linux-2.6.28-obj.然后单击Build location中的File system...按钮更改obj文件的输出目录为/home/xxx/linux-2.6.28-obj. 最终结果如下图所示:

然后单击Behaviour选项页,将build(Incremental Build)中的all更改为一个空格,将下面的clean更改为mrproper(这是默认清除内核obj文件的命令目标)。弄好后如下图所示:

 

这个时候你就可以编译内核了。Ctrl + B 开始编译内核。

编译完内核。在/home/xxx/linux-2.6.32-obj/arch/x86/boot/下将生成一个bzImage的大内核镜像。

 此时我们在xterm下运行qemu虚拟机,命令行如下:

$ qemu -s -S -hda ~/linux-0.2.img -kernel /home/xxx/linux-2.6.32-obj/arch/x86/boot/bzImage -append root=/dev/hda

 我解释一下这个命令行上的参数。

 -s 选项表示我们运行虚拟机时将1234端口开启成调试端口,供eclipse网络调试时使用

-S 选项表示我们启动虚拟机时要“冻住”虚拟机,等待调试器发出继续运行的命令。

-hda ~/linux-0.2.img 表示我们要运行时的硬盘 (这个文件可以在http://wiki.qemu.org/Download下到)
-kernel /home/xxx/linux-2.6.32-obj/arch/x86/boot/bzImage 表示我们要调试的内核镜像

-append root=/dev/hda 表示我们要传递给内核的参数(这里你可能感觉有点奇怪为啥是/dev/hda而不是/dev/hda1或是/dev/hda2呢?因为这个镜像仅仅是一个分区的二进制镜像,不是整个硬盘的镜像)

启动后,你会看到屏幕黑黑的啥也没有。因为我们指定了-S参数把虚拟机给“冻”住了。

 继续回到eclipse中,这时候我们在菜单中选择Run -> Debug Configurations ,这时候打开一个配置页面。然后我们在C/C++ Application上双击鼠标,这时在右侧的页面弹出了debug配置选项,然后我们在project一栏选择 linux-kernel ,在下面的C/C++ Application中填入/home/xxx/linux-2.6.32-obj/vmlinux,如下图所示:

然后我们单击Debugger选项页,将Debugger改为 GdbServer Debugger . 将Stop on startup at 改为start_kernel,将Connection子选项页下的Type改为TCP将Port number改为1234,最终如下图所示:

 然后单击Debug按钮开始调试!这时候Eclipse会提示我们切换 Perspective ,选择是,不再提示。

这时候就开始调试内核,而且是源码级的调试!如下图:

 

总结: 对于机器配置比较差的同学这种搭配可能比较郁闷,每次调试的时间太长了。而且还有个问题就是每次调试都要进行编译,不知道有没有选项可以禁止调试时候的自动编译,希望了解的大侠通知下小弟。

 

 

 

 

### 如何使用Eclipse调试Linux内核 #### 安装必要的工具和配置环境 为了能够顺利地通过Eclipse调试Linux内核,需要先准备好相应的开发环境。这通常意味着安装并设置好交叉编译器、QEMU模拟器以及其他辅助工具。 对于基于ARM架构的目标平台来说,可以采用如下方式准备: - **安装交叉编译链**:确保拥有适合目标硬件的GCC版本,例如`arm-linux-gnueabihf-gcc`。 - **获取源码树**:下载官方发布的稳定版或其他特定分支的Linux内核源代码,并按照需求打补丁或修改。 - **构建内核映像**:利用Makefile完成编译过程,生成可用于加载到虚拟机中的zImage文件[^4]。 #### 设置Eclipse项目结构 创建一个新的C/C++工程,在导入现有资源时指定之前提到过的内核源目录作为工作空间的一部分。接着调整项目的属性以适应实际状况下的编译选项与路径变量等参数设定。 #### 配置GDBServer连接至远程设备/QEMU实例 启动QEMU仿真器运行所选CPU型号(如vexpress-a9),并通过附加命令行开关暴露其监听端口给外部访问者。此时应当注意到开启单步执行模式(`-S`)以及启用gdbstub服务(`-s`)的重要性[^5]。 ```bash qemu-system-arm \ -nographic \ -M vexpress-a9 \ -m 1024M \ -kernel path/to/arch/arm/boot/zImage \ -append "rdinit=/linuxrc console=ttyAMA0 loglevel=8" \ -dtb path/to/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \ -S -s ``` #### 创建Debug Configuration 回到Eclipse IDE内部定义新的调试方案,选择Remote GDB Hardware Debugging类别之后输入主机名/IP地址连同对应的TCP端口号(默认情况下为1234)。另外还需指明本地符号表位置以便于断点管理和反汇编视图等功能正常使用。 最后点击Apply & Debug按钮即可触发整个流程直至到达预设的第一条指令处暂停等待进一步指示。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值