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

最终效果

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

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

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

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

完美

相关推荐
寻星探路9 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
ValhallaCoder12 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
猫头虎12 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
八零后琐话13 小时前
干货:程序员必备性能分析工具——Arthas火焰图
开发语言·python
青春不朽51214 小时前
Scrapy框架入门指南
python·scrapy
MZ_ZXD00114 小时前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
全栈老石15 小时前
Python 异步生存手册:给被 JS async/await 宠坏的全栈工程师
后端·python
梨落秋霜15 小时前
Python入门篇【模块/包】
python
阔皮大师16 小时前
INote轻量文本编辑器
java·javascript·python·c#