19、【OS】【Nuttx】【Python】gdb调试优化,python实现构建脚本

背景

接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
            }
        }
    ]
}

最终效果

点击调试选项,会跳出三个选项供选择

选择直接调试将直接跳过构建过程,进入调试环节,大大提升了调试效率

选择全量构建,进入构建模式,并重新配置项目

选择增量构建,进入构建模式,不会重新配置项目

完美

相关推荐
fillwang3 小时前
Python实现Excel行列转换
开发语言·python·excel
奇偶变不变5 小时前
30分钟学会css
人工智能·python·tensorflow
西猫雷婶5 小时前
python学opencv|读取图像(二十五)使用cv2.putText()绘制文字进阶-垂直镜像文字
开发语言·python·opencv
西猫雷婶6 小时前
python学opencv|读取图像(二十四)使用cv2.putText()绘制文字进阶-倾斜文字
开发语言·python·opencv
B站计算机毕业设计超人8 小时前
计算机毕业设计Python动漫推荐系统 漫画推荐系统 动漫视频推荐系统 机器学习 bilibili动漫爬虫 数据可视化 数据分析 大数据毕业设计
大数据·python·深度学习·机器学习·网络爬虫·课程设计·推荐算法
常家壮8 小时前
Python:交互式物质三态知识讲解小工具
开发语言·python·dubbo·物理·有趣·物质三态
Tiandaren8 小时前
医学图像分析工具01:FreeSurfer || Recon -all 全流程MRI皮质表面重建
c++·图像处理·python·深度学习·数据挖掘·数据分析·健康医疗
willhu20088 小时前
Ubuntu创建python虚拟环境
python·ubuntu
JM_life8 小时前
Python入门系列之九-数据分析与可视化
数据库·python·数据分析
途途途途9 小时前
奇怪的Python:为何 list 和 dict 的元素顺序从 Python 3.7 开始保持插入顺序?
windows·python·list