VSCode + gdb + gdbserver调试ARM程序

在开发ARM嵌入式端C/C++程序时,一般会在PC上编写代码,在Linux服务器上编译,然后将程序复制或挂载到ARM开发板上运行。如果程序出了问题,在不使用gdb的情况下,经常在代码中添加打印,编译,然后在开发板上再次运行,查看结果。添加打印、编译麻烦费时不谈,想要监视局部变量、断点执行这种方式还不支持。而使用gdb工具时,习惯了使用UI界面的人来说,基本上很难适应。这里将使用VS Code,结合gdb与gdbserver,可视化远程调试arm开发板上的linux C/C++程序。

当然,如果你的应用程序是直接在Linux x86上编译的,且非交叉编译,那么直接在Linux x86上运行即可,无需用gdbserver启动,也无需配置,点击左栏的debug图标即可编译并进入调试模式。
在这里插入图片描述

准备工作

交叉编译好的gdbserver与目标程序test。

使用交叉编译工具链编译要调试的程序,需要注意的是去掉编译选项中的"-O2"或"-O1"选项(某些代码被优化了之后,断点无法生效),并加上"-g"选项,在生成的可执行程序中包含调试信息。

开始调试

将编译好的gdbserver与生成的被调试程序test复制到目标主机中,

进入目标主机,运行如下命令。如果程序带有运行参数,直接依次写在test后面。

./gdbserver localhost:6767 test

端口号可以随意指定,后面填写vscode的配置需要用到,记录下目标主机的ip地址,后面填写配置也要用到。

在打开测试程序源代码工程的VS code窗口中,新建一个launch.json配置。如果已经有了launch.json配置,则直接打开,添加gdb调试配置。

img

img

在launch.json中修改program字段,填写生成的test文件路径。添加"miDebuggerPath"字段,填写刚刚编译生成的gdb路径。添加"miDebuggerServerAddress"字段,填写目标主机的IP与gdbserver监听的端口号。

![img](https://pic2.zhimg.com/80/v2-a0ec41e73856d7e3bf55dff3771fce49_720w.web

{
  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "(gdb) Launch", //名称
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/xx/test", // 当前目录下编译后的可执行文件
      "args": [],
      "stopAtEntry": false,
      "cwd": "${workspaceFolder}", //表示当前目录
      "environment": [],
      "externalConsole": false, // 在vscode自带的终端中运行,不打开外部终端
      "MIMode": "gdb", //用gdb来debug
      // "preLaunchTask": "build",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ],
      "miDebuggerServerAddress": "10.2.9.108:6767",
      "miDebuggerPath": "/xx/aarch64-linux-gnu-gdb"
    }
  ]
}

可以添加preLaunchTask,在启动调试前启动其他前置task,例如完成编译。嵌入式的编译往往是多样的,需要自己定义编译task,vscode的默认编译行为可能无法满足。

在文件中打上断点,监视窗口中添加想要监视的变量值,点击运行按钮,即可开始调试过程。

img

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CentOS 7 安装并配置tomcat

简介 Tomcat是一个使用Java编写的开源Web应用服务器,是由Apache Software Foundation管理的一个项目。它是一个轻量级的应用服务器,可以下载、安装和使用,而且还提供了许多高级功能,例如支持Java Servlet、JavaServer Pages (JSP)和JavaServer Faces (JSF) 等JavaEE技术,…

【C++】动态内存管理——new和delete

这篇文章我们讲一下C的动态内存管理,从一个比较陌生的知识说起,我们知道,一个工程可以创建很多.c文件,我们如果定义一个全局变量,只要用extern声明一下,在每个文件都可以用。而用static修饰的全局变量只能在…

SpringBoot面试题:(一)SpringBoot自动装配原理源码解析

源码研究 SpringBoot启动类:SpringBootApplication注解 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication public class SpringBoot1Application {public static …

项目文章|冰川宏病毒功能多样性新进展

近期,凌恩生物客户兰州大学泛第三极环境中心合作的研究论文“Diversity and function of mountain and polar supraglacial DNA viruses”发表在《Science Bulletin》(IF 18.9)。该研究结果首次系统地描述了极地冰川上DNA病毒的多样性、功能和…

【2】PyQt创建窗口

1. 第一个PyQt窗口 from PyQt5.QtWidgets import QApplication,QWidget import sys# 1.创建应用程序 app QApplication(sys.argv)# 2.创建窗口 w QWidget()# 3.显示窗口 w.show()# 4.等待窗口停止 sys.exit(app.exec()) 执行代码,就会显示PyQt窗口: 2. PyQt模块简介 PyQt中…

kubectl获取命名空间下所有configmap集合的方法

前言: 获取单个configmap并忽略特定字段的操作可参照:kubectl获取ConfigMap导出YAML时如何忽略某些字段。 要获取命名空间下所有ConfigMap并忽略特定字段,你可以使用kubectl命令与例如yq这样的工具结合使用来忽略或删除不需要的字段。以下是…

数据分享 I 各类制造业企业进入数量数据,shp/excel格式数据,覆盖2002-2019年数据,已可视化处理

随着经济的发展和社会的进步,制造业作为国民经济的重要支柱,一直保持着快速的发展态势。近年来,随着国家对制造业的大力扶持,各类制造业企业如雨后春笋般涌现出来,为经济的发展注入了新的活力。 各类制造业企业进入…

公有云迁移研究——AWS DMS

大纲 1 什么是DMS2 DMS的作用3 DMS在迁移的时候都做些什么4 在使用DMS的时候我们需要做些什么5 操作5.1 创建两个数据库终端节点5.2 创建迁移任务 6 可能遇到的问题7 总结 在本地机房或其他云往AWS上做迁移时,往往会遇到数据库迁移的任务。如果数据量不是特别大&…

widnows 使用cprofile、gprof2dot、graphviz对python项目进行可视化性能分析

1. 运行cprofile生成python方法调用信息 pr cProfile.Profile() pr.enable() # 开始记录# 要执行的代码 res your_method()pr.disable() # 结束记录 pr.dump_stats(your/path/restats.dump) #写入dump文件 pr.print_stats() #打印 2. 安装gprof2dot和graphviz 2.1 安装gpr…

十年数据分析师告诉你,这款国产数据分析工具真的很好用!

今天早上上班的时候经过一同事,看见他正苦大仇深的做着数据分析报告,老李走上前一问才知道,他的EXCEL又双叒罢工了。   数据分析师的核心能力是思维,而次核心能力就是工具。如古人云打仗需要一把趁手的兵器。对于初入行业的数据分…

数据结构-带头双向循环链表

文章目录 一.头结点二.双链表1双链表的概念与结构2.与单链表相比 三.循环链表1.关于循环链表2.循环链表的优点 四.带头双向循环链表1.带头双向循环链表2.结构图3.实现 五.代码一览 一.头结点 在链表中设置头结点的作用是什么 标识链表:头结点是链表的特殊节点,它的存在能够明确…

JS初步了解this

什么是环境对象? 环境对象:指的是函数内部特殊的变量this,它代表着当前函数运行时所处的环境 作用:弄清楚this的指向,可以让我们代码更简洁 在普通函数中: // 每个函数里面都有this 普通函数的this指向wind…

rcssci包横空出世,限制性立方样条全自动切点靓图

z致敬前辈:R语言统计与绘图 仅以本篇2800字真文一并纪念工作11年来潦倒的收入、间歇的鸡血、憋屈的倔强、幽暗的过往和心中的远方。 1 缘起 Restricted cubic splines (RCS)近年来火遍各类SCI期刊,初次接触的小伙伴们可以去搜索笔者前期的2篇RCS文章补充一下基础知…

6.5 Windows驱动开发:内核枚举PspCidTable句柄表

在 Windows 操作系统内核中,PspCidTable 通常是与进程(Process)管理相关的数据结构之一。它与进程的标识和管理有关,每个进程都有一个唯一的标识符,称为进程 ID(PID)。与之相关的是客户端 ID&am…

(C语言)求出1,2,5三个数不同个数组合为100的组合个数

#include<stdio.h> int main() {int count;for(int i 0;i < 100;i )for(int j 0;j < 50;j )for(int k 0;k < 20;k ){if(i j*2 k*5 100){count;printf("100可以拆分为%d个1元&#xff0c;%d个2元&#xff0c;%d个5元\n",i,j,k);} }printf("…

2023年度端侧transformer类分类力作SwiftFormer模型解读

写在前面&#xff1a;本篇直接结合代码来理解网络的笔记 paper: Swiftformer-paper code: https://github.com/Amshaker/SwiftFormer 文章目录 网络结构精析零、整体一、patch embed二、stage 网络结构精析 零、整体 可以看到结构中&#xff0c;整体就是&#xff1a; stem -&…

洗地机哪个牌子好用?洗地机希亦、石头、添可、西屋谁的清洁力更强?

洗地机的出现极大地改善了清洁过程&#xff0c;提高了效率&#xff0c;减少了人力投入。但随着市场上洗地机的种类和功能不断增加&#xff0c;人们可能会感到困惑&#xff0c;不知道如何选择适合自己需求的机器。为了帮助消费者更好地了解洗地机的选择&#xff0c;今天我将带大…

从Intel Cyclone10GX TransceiverPHY 高速收发器认识ATX PLL、FPLL、CMU PLL等PLL

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 在使用Intel Cyclone10GX TransceiverPHY的过程中发现这个IP还是比较复杂的&#xff0c;特别是时钟系统&#xff0c;提到了多种PLL:ATX PLL、FPLL、CMU PLL&#xff0c;这里进行一下扩展学…

vue3项目打包发布到apache服务器的流程

vue3项目打包发布到apache服务器的流程&#xff08;不包含开机自启动apache&#xff09; 1. 下载部署apache服务器 打开apache官网https://www.apachelounge.com/download/ 下载windows的apache版本。 2. 在本地的E盘新建一个文件http&#xff0c;把下载好的apache解压放进…

时间选择器

<el-form-item label"时间范围"><!-- <el-date-picker size"small"v-model"createTime"type"daterange"range-separator"至"start-placeholder"请输入起始创建时间"end-placeholder"请输入终止创…