您的位置:首页 > 运维架构 > Linux

Eclipse CDT + QEMU 调试linux内核

2013-07-19 21:22 176 查看
有关调试的好处我想大家都不言自明了。本文章摘自原文,但加入了原文中没有说明的一些细节内容。

我的系统环境是:Ubuntu 9.10 + eclipse-cpp-galileo-SR1-linux-gtk.tar.gz + QEMU 0.11.0Ubuntu 在安装时,如同大部分 Linux 发行版一样,都会同时安装 GNU 版本的 Java。这个 Java

的实用程度太低,尤其对于开发人员来说,是没有太多用处的。在 Ubuntu 下,安装 SUN Java 是一件很容易的事情。

第一步:

sudo apt-get install sun-java6-jre

sudo apt-get install sun-java6-jdk

安装完毕之后,选择默认 java:

sudo update-alternatives --config java

然后配置环境变量:

sudo vim /etc/environment

在其中添加如下两行:

CLASSPATH=/usr/lib/jvm/java-6-sun/lib

JAVA_HOME=/usr/lib/jvm/java-6-sun

保存退出。

之后安装配置 Eclipse。安装很简单:

sudo apt-get install eclipse

虽然已经这时新安装的 java

已经成为系统默认的 jvm,但是 Eclipse 并不会用 update-alternative 设置的jvm 来启动自身,而使用的是以前的 GNU

Java。GNU Java 是 1.4.2 的实现,而且在性能上远不如 SUN 的实现。为了让Eclipse 利用 SUN Java

启动,我们还需要继续配置。首先把 SUN Java 完完全全的设置为系统的默认 JDK:

sudo update-java-alternatives -s java-6-sun

然后编辑 JVM 配置文件:

sudo vim /etc/jvm

把文件中的

/usr/lib/jvm/java-6-sun

这一行移动到配置块的顶部。由于 Eclipse

会忽略 Ubuntu 的通用 Java 设置(貌似一个 bug),我们需要继续编辑 Eclipse 的 java_home 文件:

sudo vim /etc/eclipse/java_home

如同上面一样,把

/usr/lib/jvm/java-6-sun

这一行移动到文件的顶部。所有的安装配置完成之后,Ubuntu 的 Java

开发平台就基本完备了。

安装CDT:



http://www.eclipse.org/cdt/downloads.php

下载CDT

http://www.eclipse.org/downloads/download.php?file=/tools/cdt/releases/callisto/dist/3.1.2/org.eclipse.cdt-3.1.2-linux.x86.tar.gz

tar zxvf org.eclipse.cdt-3.1.2-linux.x86.tar.gz

解压后将features和plugins文件夹下的所有文件拷贝到/usr/lib/eclipse下对应的目录下即可。

文章开始!

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

$ cd (回到主目录)

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

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

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

$ make O=/home/xxx/linux-2.6.28-obj menuconfig (这里我们要配置内核,并在~/linux-2.6.28-obj目录下生成内核配置文件.config) (注意:这里的xxx表示的是你的用户名)

注意在这里我们要选择kernel hacking 配置菜单下的

"Compile the kernel with debug info" 和 "Compile the kernel with frame pointers"

如下图:



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 键开始编译工程。注意,如果elipse提示说 工程is not clean ,那么只需要在xterm下进入源码树目录,输入make mrproper就可以了。注意这里编译内核花费的时间取决于你的开启选项的多少,所以在menuconfig时,尽可能的将不必要的选项去掉,这样可以缩短编译内核的时间。

。。。

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

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

$ qemu -s -S -hda ~/linux-0.2.img -kernel /home/xxx/linux-2.6.28-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.28-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.28-obj/vmlinux,如下图所示:



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



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

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



后面的啥查看寄存器,查看变量,都不用我多说了吧。享受调试内核的乐趣吧!

原文:http://www.cnblogs.com/yangnas/archive/2010/03/18/1688885.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: