背景
调试环境对于学习源码非常重要,但嵌入式系统的调试环境搭建稍微有点复杂,需要的条件略多。本文章介绍如何在 Zephyr 提供的 qemu 上调试 Zephyr 源码,为后续分析 Zephyr OS 相关原理做铺垫。
环境
我的开发环境为 wsl ubuntu,对于 windows 也是同样的原理。基于 vscode 图形化界面有利于阅读源码,其基本原理是 vscode 通过 gdb 连接(tcp 通信) qemu 运行起来的 gdb server。
编译并运行 qemu
通过以下命令编译 qemu_cortex_m3 bsp
west build -b qemu_cortex_m3 samples/hello_world/ -d samples/hello_world/build
-b 指定目标 bsp
-d 指定编译文件生成的目录(cmake 生成的相关文件)
进入到 build 目录后,通过以下命令启动 qemu
ninja debugserver
vscode 环境搭建
创建 debug 配置文件 launch.json,如下图:
编辑 launch.json 文件,并修改部分配置:
{
"version": "0.2.0",
"configurations": [
{
"name": "zephyr",
"type": "cppdbg", // 需要安装 C/C++ 插件
"request": "launch",
"program": "/home/null/zephyrproject/zephyr/samples/hello_world/build/zephyr/zephyr.elf",
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceRoot}",
"externalConsole": true,
"miDebuggerServerAddress": "localhost:1234", // 指定 gdb server 端口,默认端口为 1234
"serverLaunchTimeout": 2000,
"targetArchitecture": "ARM",
"launchCompleteCommand": "exec-run",
"MIMode": "gdb",
"miDebuggerPath": "/home/null/zephyr-sdk-0.16.4/arm-zephyr-eabi/bin/arm-zephyr-eabi-gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
]
}
点击左侧小虫子,如下图:
最终调试窗口如下图:
这样就能调试整个 Zephyr 源码了,并且不需要真实的嵌入式环境,建议把优化等级调为 O0,Zephyr 默认优化等级为 Os