VSCode gdb 调试 qemu u-boot 的方法

news2025/1/16 0:53:52

前言

  • 最近使用 VS Code GDB 调试 qemu,有了一点收获,u-boot 编译后生成了一个 elf 文件:u-boot,是否也可以调试一下?

  • 为何需要 VS Code GDB 调试,直接 gdb 调试不就可以了吗?答案就是:VS Code 可以界面调试,命令行调试会枯燥很多

环境

  • 使用 qemu,就是不需要板子

  • win10 64位 VMware Workstation Pro 16

  • ubuntu 20.04

  • qemu (虚拟ARM开发板),qemu arm64 平台

  • u-boot : u-boot-2023.04

  • gcc 交叉编译工具链:gcc version 12.2.1 20230401

目标

  • 基于 qemu,VS Code GDB,界面调试 u-boot,了解 u-boot 的启动流程

  • qemu:不需要硬件电路板支持,当前一些启动初始化流程可能与实际电路板存在差异,所以目标就是摸清楚 u-boot 的启动流程,重在搞清楚 u-boot 启动与初始化流程。

  • VS Code,这里重在界面调试,类似于 eclipse 那样的,可以源码调试

  • GDB:是一个强大的调试工具

编译 u-boot

  • 配置文件:configs/qemu_arm64_defconfig

  • 生成配置:make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- qemu_arm64_defconfig

  • 【备注】:当前 u-boot-2023.04 ARM 与 ARM64 没有分开,所以 ARCH=arm,而不是 ARCH=arm64

  • 开始编译: make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu-

  • 生成的产物: u-boot.bin:二进制文件, u-boot: elf 可执行文件,默认包含 debug 信息

配置 VS Code gdb

  • 当前 是 Win10 下 VS Code 通过 SSH 连接 VM虚拟机中的 ubuntu,如果本地是 ubuntu 系统,应该就不需要 SSH 远程连接

  • VS Code 安装 gdb 调试插件

在这里插入图片描述

  • 【备注】gdb 这个插件,好像不需要,确认下左边栏 是否有个 DEBUG 调试按钮吧,好像是 VS Code 自带的。

  • 配置 VS Code 调试:点击 【设置】的按钮,会提示选择某个调试器,这里随便选择一个,然后就会出现一个 .vscode/launch.json 文件

  • 修改 launch.json 文件内容如下

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "uboot-debug",
            "type": "cppdbg",
            "request": "launch",
            "miDebuggerServerAddress": "127.0.0.1:1234",
            "miDebuggerPath": "/home/zhangsz/linux/tools/gcc-linaro-12.2.1-2023.04-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gdb",
            "program": "${workspaceFolder}/u-boot",
            "args": [],
            "stopAtEntry": true,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "logging": {
                "engineLogging": false
            },
            "MIMode": "gdb",
        }
    ]
}
  • 注意点一:"miDebuggerPath": "/home/zhangsz/linux/tools/gcc-linaro-12.2.1-2023.04-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gdb",,这里设置 gcc gdb 的执行路径,全路径即可,这里的 gdb,来自 gcc version 12.2.1 20230401 交叉编译工具链

  • 注意点二:"program": "${workspaceFolder}/u-boot",,这里选择 u-boot,也就是 ELF 文件,而不是 u-boot.bin 二进制文件

  • 注意点三:"stopAtEntry": true,,这里选择 所有 的 执行 入口函数,都有断点停下来,否则可能 u-boot 无法调试

qemu 启动与调试脚本

  • qemu 启动脚本:qemu.sh,可以确认 u-boot 是否可以正常启动
#!/bin/bash
qemu-system-aarch64 -machine virt \
        -nographic \
        -m 512M \
        -cpu cortex-a57 \
        -kernel u-boot \
  • qemu 调试调试脚本,qemu-debug.sh,执行此脚本,可以进入 qemu 调试
#!/bin/bash
qemu-system-aarch64 -machine virt \
        -nographic \
        -m 512M \
        -cpu cortex-a57 \
        -kernel u-boot \
        -s -S

调试方法

  • 执行 qemu-debug.sh,此时会卡住,也就是 qemu 处于【冻结】状态

  • 点击 调试图标的 【运行】按钮:

在这里插入图片描述

  • 进入调试界面:

在这里插入图片描述

  • 此时可以加断点进行调试,可以单步【F11】或者 【F10】进行调试

在这里插入图片描述

  • 如此, VS Code gdb 源码调试 u-boot 的环境搭建成功了

备注

  • 好像 u-boot 有一段 重定位的操作,经过重定位后, VS Code gdb 就无法正常加人断点了,也就是没有了调试符号与信息,这部分后续再梳理一下。

  • 当前的 VS Code gdb 界面源码调试 u-boot,可以从 reset 开始,单步【F11】配合【F10】与 手动断点,了解 u-boot 的第一阶段的启动流程,感觉对熟悉 u-boot 启动流程 还是有点用处。

小结

  • VS Code GDB 调试功能,感觉有点像专业的 Visual Studio 的感觉了,嵌入式软件可以调试,这本身就是一件好事,利于熟悉代码执行流程、问题定位等。

  • 调试过程中,有寄存器、局部变量、断点、【监视】watch 等窗口,可以观察程序执行的当前状态,很有用,至少比 gdb【命令行】调试起来舒服与高效

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/678938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

区块链技术的应用与前景展望

第一章:引言 在当今数字化时代,区块链技术作为一项前沿技术正迅速崭露头角,并在各个行业展现出巨大的潜力。区块链技术不仅仅是比特币和其他数字货币的基石,更是一种分布式、去中心化的记账和验证技术。本文将探讨区块链技术的应…

Matlab评价模型-TOPSIS法(优劣解距离法)

评价模型-TOPSIS法(优劣解距离法) 1.1 概念 TOPSIS 法是一种常用的组内综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。基本过程为基于归一化后的原始数据矩阵,采用余弦法找出有限方案中的最优方案和最劣…

C++14部分新特性

文章目录 1、lambda表达式2、constexpr关键字3、函数返回类型推导4、变量模版5、二进制字面值6、数字分位符7、通过类型寻址多元组8、make_unique 1、lambda表达式 C14提供了在lambda式的形参声明中使用auto的能力 泛型 lambda:C14 中的 lambda 表达式可以使用模板…

可维护的代码,高复用性之路:函数式编程带你飞

文章目录 I. 前言介绍函数式编程引言:为什么需要函数式编程 II. 函数式编程基础声明式编程和命令式编程比较纯函数:概念,优点和局限性不可变数据:概念,优点和局限性 III. 函数式编程优点易于理解和调试代码可以提高代码…

Matlab数学建模-典型相关分析

统计分析-典型相关分析 概念 典型相关分析是研究两个多变量(向量)之间之间的线性相关关系,能够揭示出两组变量之间的内在联系。 CCA(典型相关分析) 在一元统计分析中,用相关系数来衡量两个随机变量的线性相关关系,…

C++ 第三弹继承和多态-类和对象

目录 1.继承 1.1什么是继承? 1.2语法格式 1.3继承权限 1.4继承概念语法格式 1.5赋值兼容规则 1.6继承体系中的作用域 1.7在继承体系中的构造和析构 1.8静态成员继承 1.9友元的继承 1.10不同继承方式下子类的对象模型 1.11继承和组合 2.多态 2.1什么是…

分销架构总结

概述 对于过往分销系统的经验总结。视角上会不区分实物及虚拟服务的分销。 分销定义:将产品从生产者转移到消费者。 分销职责:获客,服务(售前,售中,售后)。核心是通过不同分销渠道将产品能卖出去。 在整体分销网络…

jjy-share-v1.0 一键分享到微博、QQ空间、QQ好友、微信,一键分享,一键分享代码,一键分享插件,一键分享代码插件

项目地址: jjy-share-v1.0: 一键分享到微博、QQ空间、QQ好友、微信作者: 极纪元-橙作者博客:https://cplvfx.blog.csdn.net/码云Gitee:https://gitee.com/cplvfx/时间:2023年6月21日 介绍 一键分享到微博、QQ空间、…

Qt下使用QPainter实现界面上饼状图、圆环图的绘制

文章目录 前言一、示例讲解二、圆环图绘制步骤三、设置圆环图数据四、示例完整代码五、下载链接总结 前言 前面的文章有讲述使用Qt下的Charts 模块来进行饼图的绘制:QChart实现ui界面上指定位置饼状图、圆环图的绘制,但是使用过程中并不能很好的实现自己…

Embedding 嵌入知识入门

原文首发于博客文章Embedding 嵌入知识入门 文本嵌入是什么 向量是一个有方向和长度的量,可以用数学中的坐标来表示。例如,可以用二维坐标系中的向量表示一个平面上的点,也可以用三维坐标系中的向量表示一个空间中的点。在机器学习中&#x…

强化学习从基础到进阶-案例与实践[4.1]:深度Q网络-DQN项目实战CartPole-v0

【强化学习原理项目专栏】必看系列:单智能体、多智能体算法原理项目实战、相关技巧(调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍:【强化学习原理项目专栏】必看系列:单智能体、多智能体算法原理项目实战、相关技巧…

Redis 原理

Redis 原理 动态字符串SDS Redis中保存的key时字符串,value往往是字符串或字符串集合,字符串是Redis中常见的数据结构 Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题,使用起来不方便 Redis构建了一种新型的字…

Web网页制作-知识点(3)——HTML5新增标签、CSS简介、CSS的引入方式、选择器、字体属性、背景属性、表格属性、关系选择器

目录 HTML5新增标签 CSS简介 CSS概念 CSS的作用 语法 CSS的引入方式 内联样式(行内样式) 内部样式 外部样式(推荐) 选择器 全局选择器 元素选择器 类选择器 ID选择器 合并选择器 选择器的优先级 字体属性 …

Linux——文件基础IO的文件描述符和重定向实现理解

目录 前言: 首先来回顾一下open函数,即在进程中同时打开多个文件: Linux底层进程与文件的关系 : 二.重定向的实现 什么是重定向? 方法1: 2.1关闭stdin: 运行结果: ​编辑由结果知…

统计字符串数组中各元素中指定字符串出现的次数numpy.char.count()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 统计字符串数组中各元素中 指定字符串出现的次数 numpy.char.count() [太阳]选择题 下列代码最后输出的结果是? import numpy as np s np.array([I, Love, Python]) print("…

ChatGPT底层架构Transformer技术及源码实现(二)

ChatGPT底层架构Transformer技术及源码实现(二) Gavin大咖微信:NLP_Matrix_Space 3.2 图解Transformer精髓之架构设计、数据训练时候全生命周期、数据在推理中的全生命周期、矩阵运算、多头注意力机制可视化等 如图3-14所示,是Transformer编解码的示意图,中间有个关键内…

LFS11.3在VMware中安装后需要做的准备

参考lfs 11.3和Blfs 11.3 先简单罗列一下要做的步骤,后续有机会再补充一下细节,遇到问题欢迎读者留言。 1、配置vmware中的网络连接 使用vmware net8 net模式,选用VMnet 配置网络连接/etc/sysconfig/ 目录下ifconfig.*** (***为…

fanuc机器人安装profinet IO基板产生报警

fanuc机器人安装profinet IO基板产生报警: SYST-302 请关闭电源 PRIO-397 PMIO 固件需要更新 %x %x 问题描述:新的R30iB‐Plus柜的GSDML 文件与R30iB柜的GSDML文件是不同的,GSDML文件与R834固件版本不匹配的话,会无法扫描到R834的卡,导致无法通讯 解决方法:确认 Expecte…

Diffusion Models: 方法和应用的综合调查 【01】Diffusion Models基础

Diffusion Models: 方法和应用的综合调查 【01】Diffusion Models基础 原文链接:Diffusion Models: 方法和应用的综合调查 【01】Diffusion Models基础 GitHub: https://github.com/YangLing0818/Diffusion-Models-Papers-Survey-Taxonomy. Paper: https…

MySQL学习基础篇(一)

一、数据库概述 1. 为什么要使用数据库 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”,而持久化的实现过程大多通…