使用 Eclipse 单步调试 Zephyr 程序
调试环境:Ubuntu+Qemu+Eclipse
目录
安装 eclipse CDT
安装 jdk/jre
- sudo apt-get install default-jdk
复制代码
安装 eclipse cdt
从
官网下载 eclipse 安装器
- wget http://mirror.rise.ph/eclipse/oomph/epp/neon/R2a/eclipse-inst-linux64.tar.gz
复制代码
解压并执行安装文件
eclipse-inst
- tar xf eclipse-inst-linux64.tar.gz
- cd eclipse-installer/
- ./eclipse-inst
复制代码
在安装界面中选择 Eclipse IDE for C/C++ Developers,然后在新弹出的安装界面设置安装路劲,并安装。
然后等待安装完成即可。
建立工程
进入你的eclipse安装目录,默认是 ~/eclipse/cpp-neon/eclipse,然后启动 eclipse:
- cd ~/eclipse/cpp-neon/eclipse
- ./eclipse &
复制代码
选择工作空间
关闭欢迎界面
在菜单栏依次选择 File->New->Makefile Project with Existing Code(Ubuntu 有菜单活动时无法截图,所以就未截图了)。
然后在新弹出的界面上点击 Browse 按钮选择 zephyr 源码所在目录,并填好 Project Name,然后点击 Finish。
然后工程就创建好了。
编译
对于每个不同的应用程序,我们都需要创建它自己的target,这里以 hello-world 例程为例。
找到 Build Target 栏(如果没有,在菜单栏依次选择 Window->Show View->Build Target)。可以看到,它是一个目录结构,
选择我们要创建的应用程序 hello-world 所在目录,然后右键,选择 New,在新弹出的对话框填上如下内容:
- Target name: 这个可以随便写,只是我们自己看的。
- Build Target: BOARD=qemu_x86 qemu(把括号的勾去掉)
- Build Command: make
请注意我上面加红加粗的地方,它们三个所表示的意思是在samples/hello_world 目录下面执行命令 make BOARD=qemu_x86 qemu.
然后点击 ok 按钮,此时会发现 Build Target 栏里面多了一项 test(即我们刚刚输入的 target name)。
然后我们可以双击该 test 目标进行编译。但是编译时可能会发现如下错误:
一眼就能看出来这是没有在zephyr的根目录下执行source操作。这个问题有两种解决办法:
- 关eclipse,在终端里先执行 source 操作,再在该终端里启动 eclipse 【推荐】
- 将 source 命令放到你的环境变量所在文件中去
然后,我们再点击该按钮,终于可以编译了:
但是还有一个坑,我们注意上图中右下角的两个地方,编译进度始终卡在那儿动,这是因为我们在编译时启动了qemu进行仿真,而系统运行结束后在等待我们输入 "ctrl+a, x" 来终止qemu。但是事实上,我们没办法在eclipse的控制台上面输入
"ctrl+a, x",所以我们需要强行终止编译过程。先点击右下角的小方块,然后在新弹出的界面中点击进度条右边的图标,结束编译过程。
调试
配置调试环境
依次在菜单栏中选择 run->debug configuration,然后在弹出的界面中,双击 C/C++ remote Application 新建一个调试项目,并将其命名为 hello-world,然后再选择下面的 Select Other,在新弹出的界面中选择 Manual 这一项,然后保存。
然后按下图所示进行填充。
然后点击 apply 按钮保存(close和debug两个按钮先不要动)。
开始调试
理论上,我们现在就可以直接在eclipse里面编译,然后进行 debug 了,但是由于 eclipse 是单任务的,必须等编译完成后才能进行下一个任务(调试),而编译时会卡在qemu上面,由此造成了死锁,所以我们不得不绕一个弯。我们先直接在终端中执行命令:
- make OARD=qemu_x86 debugserver
复制代码
然后再在eclipse里面点击调试按钮进行调试。在弹出的对话框中选择 Proceed 和 Yes 按钮。然后,终于可以了:
说明
理论上,直接用开发板也可以进行调试,参考:
https://www.zephyrproject.org/doc/boards/x86/arduino_101/doc/board.html中的 Debugging 一小节。
调试启动时默认是停留在 main 函数里面,但是你也可以修改调试配置,让它停留在内核的其它地方。