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