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

最终效果

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

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

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

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

完美

相关推荐
Q_Q196328847513 小时前
python+django/flask基于机器学习的就业岗位推荐系统
spring boot·python·django·flask·node.js·php
AI科技星14 小时前
张祥前统一场论动量公式P=m(C-V)误解解答
开发语言·数据结构·人工智能·经验分享·python·线性代数·算法
海琴烟Sunshine14 小时前
leetcode 345. 反转字符串中的元音字母 python
python·算法·leetcode
ithicker14 小时前
Pycharm+Deepseek结合使用Continue插件无法返回中文产生乱码
ide·python·pycharm
棉猴14 小时前
《pygame中Sprite类实现多帧动画》注-通过多张序列帧显示动画2-1
python·游戏·pygame·游戏编程
权泽谦15 小时前
用 Python 做一个天气预报桌面小程序(附源码 + 打包与部署指导)
开发语言·python·小程序
“负拾捌”15 小时前
LangChain提示词模版 PromptTemplate
python·langchain·prompt
合作小小程序员小小店15 小时前
web安全开发,在线%服务器日志入侵检测%系统安全开发,基于Python,flaskWeb,正则表达式检测,mysql数据库
服务器·python·安全·web安全·flask·安全威胁分析·安全架构
dreams_dream15 小时前
Django序列化器
后端·python·django
懷淰メ15 小时前
python3GUI--短视频社交软件 By:Django+PyQt5(前后端分离项目)
后端·python·django·音视频·pyqt·抖音·前后端