背景
接wiki
18、【OS】【Nuttx】用gdb调试nuttx os
已经可以用gdb调试os程序了,不过有一点麻烦的是,每次点击调试按钮,都需要重新配置,构建一遍,甚是麻烦,
目标
gdb调试时,提供构建选项,需要全量构建(重新配置程序),还是增量构建(不需要配置程序,只对修改的文件执行增量编译),还是不需要构建,直接调试(很多时候调试不用重新编译)
解决方案
考虑到编程语言的友好性和可移植性,放弃shell脚本,选择python作为构建脚本
vscode商店安装必要的python包
构建脚本路径如下:
/nuttx/scripts/build
python
#!/usr/bin/env python3
import os
import argparse
import subprocess
def main():
# 创建 ArgumentParser 对象
parser = argparse.ArgumentParser(description="处理构建选项")
# 添加命令行选项
parser.add_argument('-r', '--recursive', action='store_true', help='递归处理目录中的所有文件,并进行重新配置')
# 解析命令行参数
args = parser.parse_args()
os.chdir("..")
if args.recursive:
subprocess.run(["make", "distclean"], text=True)
subprocess.run(["tools/configure.sh", "sim:ostest"], text=True)
subprocess.run(["make clean; make"], text=True)
else:
subprocess.run(["make"], text=True)
if __name__ == "__main__":
main()
这里选择 -r 作为全量构建的编译选项,recursive 递归处理项目中所有文件,并进行重新配置,当没有 -r 编译选项时,默认使用增量构建,即只对修改过的文件进行编译并重新链接,加快构建过程
重新调整tasks.json
这里新增了三个输入选项,全量构建,增量构建,直接调试;选择全量构建和增量构建时,会调用上面的构建脚本执行对应构建;直接调试则会跳过构建过程,直接调试输出件(前提得有)
bash
{
"version": "2.0.0",
"tasks": [
{
"label": "nuttx_build", // 这个标签应该与 launch.json 中的 preLaunchTask 匹配
"type": "shell",
"command": "bash",
"args": [
"-c",
"build() { if [ \"$1\" == \"skip\" ]; then return; else ${workspaceFolder}/nuttx/scripts/build $1; fi; }; build \"${input:build_select}\""
],
"options": {
"cwd": "${workspaceFolder}/nuttx/scripts" // 设置当前工作目录
},
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": ["$gcc"],
"detail": "Generated task to build the project using make."
}
],
"inputs": [
{
"id": "build_select",
"type": "pickString",
"description": "need build?",
"options": [
{
"label": "全量构建",
"value": "-r",
},
{
"label": "增量构建",
"value": "",
},
{
"label": "直接调试",
"value": "skip",
}
],
"default": "skip"
}
],
}
launch.json不变,还是老样子
bash
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) nuttx_os",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/nuttx/nuttx", // 替换为你的可执行文件路径
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}/nuttx",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "nuttx_build", // 在启动调试之前运行的任务名称
"miDebuggerPath": "/usr/bin/gdb", // GDB 的路径,如果不在默认路径中请指定
"logging": {
"engineLogging": false,
"traceResponse": false
}
}
]
}
最终效果
点击调试选项,会跳出三个选项供选择
选择直接调试将直接跳过构建过程,进入调试环节,大大提升了调试效率
选择全量构建,进入构建模式,并重新配置项目
选择增量构建,进入构建模式,不会重新配置项目
完美