当前位置: 首页 > news >正文

【工具】使用VS Code调试Docker Container中的代码

目录

  • 使用VS Code调试Docker Container中的Autoware.ai代码
    • 第一种方法 -- 在VS Code中进行Debug
      • Step1
      • Step2
      • Step3
      • Step4
        • c_cpp_properties.json
        • launch.json
        • settings.json
        • task.json
      • Step5
      • Step6
      • Step7
      • 参考链接
    • 第二种方法 -- cmake重新编译
      • cmake
        • 使用方法(简介)
        • cmake常用目录结构
          • build
          • bin
          • lib
          • src
        • 教程
      • Autoware编译结构
        • 查看Autoware的编译类型
      • 修改CMakeList.txt文件
      • 参考链接
          • OpenPlanner项目独立的github链接
          • colcon使用文档
          • build Autoware from source
          • How to check if program was compiled with debug symbols? [duplicate]
          • VSCode debug cpp ROS node - compile package with debug mode
          • C/C++: How do you set GDB debug flag (-g) with cmake?

使用VS Code调试Docker Container中的Autoware.ai代码

第一种方法 – 在VS Code中进行Debug

在用这个方法时踩到了一些坑,一度搞得我很无奈。后面解决的方法也有点莫名其妙。下面详细叙述下。

Step1

首先创建docker container,这里我是用命令行创建的。然后运行autoware提供的/docker/generic/下的run.sh,即会自动创建docker container并进入到container中。此时docker --version为Docker version 20.10.18, build b40c2f6.
更新vs code到最新版本,安装docker 插件
在这里插入图片描述

Step2

点击左侧任务栏的docker按钮, 可以看到显示所有的container,右击选择Attach Visual Studio Code

在这里插入图片描述
会弹出一个新的窗口,可以在左侧任务栏看到DEV CONTAINERS已经连接,如下图所示。
在这里插入图片描述
这里曾经遇到两个坑
第一个是在点击Attach Visual Studio Code后,VS Code出现弹框报错,内容为“Remote - Containers Docker version 17.12.0 or later required.”
但其实Docker的版本已经是20往上了,搜到了这个解决办法,但是貌似没啥用。。
第二个坑是,把后面的都配置好之后,点击Debug按钮调试cpp文件,调用的竟然是python的debugger,然后发现是在文档里面,调试过python代码,不知道为啥默认就用了那个,选择gdb也不好使。把之前的目录删了以后,发现可以了。。。
而且同时,再点Attach Visual Studio Code就可以用了。。。所以不知道是不是因为这个影响了第一个问题。
总而言之解决的莫名其妙。
按理说,VS Code这边的Docker插件都能检测到container里面的内容,所有代码均可查看,而且执行Attach to Shell命令,也可以正常进入到docker container里面的命令行,应该说vscode是连接到了container了,不知道为啥会出现第一个问题。
总之解决了。

Step3

点击File按钮,打开/home/autoware/Autoware/src/autoware目录作为工作目录。
在这里插入图片描述

Step4

/home/autoware/Autoware/src/autoware/目录下创建文件夹.vscode
分别创建四个文件,文件名和内容分别如下

c_cpp_properties.json

{"configurations": [{"browse": {"databaseFilename": "","limitSymbolsToIncludedHeaders": true},"includePath": ["/opt/ros/melodic/include/**","/usr/include/**"],"name": "ROS","intelliSenseMode": "gcc-x64","compilerPath": "/usr/bin/clang","cStandard": "c11","cppStandard": "c++14"//"compileCommands": "${workspaceFolder}/build/compile_commands.json"}],"version": 4
}

launch.json

// {
//     // 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": []
// }
{"version": "0.2.0","configurations": [{"name": "(gdb) Launch", // 配置名称,将会在调试配置下拉列表中显示"type": "cppdbg",  // 调试器类型 该值自动生成"request": "launch",  // 调试方式,还可以选择attach"program": "/home/autoware/Autoware/build/gnss_localizer/devel/lib/gnss_localizer/fix2tfpose", //要调试的程序(完整路径,支持相对路径)"args": [],  // 传递给上面程序的参数,没有参数留空即可"stopAtEntry": false,  // 是否停在程序入口点(停在main函数开始)"cwd": "${workspaceRoot}",  // 调试程序时的工作目录"environment": [], //针对调试的程序,要添加到环境中的环境变量. 例如: [ { "name": "squid", "value": "clam" } ]"externalConsole": false,   //如果设置为true,则为应用程序启动外部控制台。 如果为false,则不会启动控制台,并使用VS Code的内置调试控制台。"MIMode": "gdb",  // VSCode要使用的调试工具名称"miDebuggerPath": "/usr/bin/gdb","setupCommands": [{"description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true}]}]
}

settings.json

{"files.associations": {"iostream": "cpp"}
}

task.json

{"version": "2.0.0","tasks": [{"type": "catkin_make","args": ["--directory","/home/autoware/Autoware/src/autoware/","-j4","-DCMAKE_BUILD_TYPE=Debug","-DCATKIN_WHITELIST_PACKAGES=<package_name>"],"problemMatcher": ["$catkin-gcc"],"group": {"kind":"build","isDefault":true},"label": "catkin_make: build"}]}

Step5

在docker container中安装gdb debugger

$ gdb -help 
$ sudo apt-get install libc6-dbg gdb valgrind  # to install

确保gdb的地址是正确的。检查launch.json文件中包含miDebuggerPath的一行。

Step6

launch.json文件中,编辑program这一行,指定在/build目录下,比如

/home/autoware/Autoware/build/op_global_planner/devel/lib/op_global_planner/op_global_planner

Step7

/src目录下找到对应的cpp文件,比如

/home/autoware/Autoware/src/autoware/core_planning/op_global_planner/nodes/op_global_planner.cpp

确保所有的必要topic信息都可以被订阅到,点击debug按钮,并选择"(gdb)launch" debugger

参考链接

Open container fails with “Docker version 17.12.0 or later is required” #5396
Attached container configuration reference
VSCode代码调试器
【VSCode】调试器debugger详细使用手册

第二种方法 – cmake重新编译

Autoware默认编译的版本为release版本,因此需要编译为debug模式来进行调试。
要完成这个任务,需要做几个方面的工作。

  • 学习cmake
  • 了解Autoware中的编译结构
  • 修改CMakeLists.txt文件,并重新编译为debug模式

cmake

Autoware项目是用cmake编译的,首先需要对cmake的用法有所了解。
众所周知,C++中cpp文件无法直接运行,需要编译成.o.obj这种object目标文件,才能够执行。

使用gcc命令可以分别编译每个cpp文件,但这样很麻烦,cmake则提供了批量编译很多文件的简便方法。

使用方法(简介)

为一个项目建立CMakeLists.txt文件,在文件里按照规定的语法编写,然后执行

$ cmake ..
$ make

命令,会生成编译文件,主要的(应该也是最基础的文件)包括

CMakeCache.txt  CMakeFiles  cmake_install.cmake  Makefile

并可以用make clean命令来清楚生成的object文件

cmake常用目录结构

build

通常为项目创建build目录,在这个目录下执行cmakemake命令,生成的文件都在这下面(除了目标文件),将编译生成的文件都放在build目录下还有一个好处是,重新编译需要删除这些编译文件时,可以直接删除,不会和其他需要的文件混在一起。

bin

通常用来存放生成的object文件,但是也不一定,比如Autoware就放在每个小模块的CMakeFiles文件夹下面

lib

通常用来存放库文件,包括.a静态库和.so动态库。

src

用来存放cpp源文件。

教程

【C++】Cmake使用教程(看这一篇就够了)
【C++】静态库和动态库文件的生成和使用

Autoware编译结构

Autoware路径下的目录结构为

build/ install/ log/ src/

其中:
build文件夹存放了各个模块编译相关的文件,模块目录下的CMakeFiles存放了生成的object文件。
src文件夹存放了CMakeLists.txt文件。比如/home/autoware/Autoware/src/autoware/core_planning/op_global_planner/路径

查看Autoware的编译类型

How to check if program was compiled with debug symbols?

修改CMakeList.txt文件

在CMakeLists.txt文件里增加两行,

set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_BUILD_TYPE RelWithDebInfo)

然后回到build目录,执行以下命令进行编译

$ colcon build --cmake-args -DCMAKE_BUILD_TYPE=RelWithDebInfo

如果要编译为Release版本,则执行
Without CUDA Support

$ colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release

With CUDA support

$ AUTOWARE_COMPILE_WITH_CUDA=1 colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release

参考链接

OpenPlanner项目独立的github链接

https://github.com/hatem-darweesh/autoware.ai.openplanner/tree/dd9bda08e2bb13b0ad501514098f853a38be7732

colcon使用文档

https://colcon.readthedocs.io/en/released/user/quick-start.html

build Autoware from source

https://gitlab.com/autowarefoundation/autoware.ai/autoware/-/wikis/Source-Build?version_id=a33764ab4b6e7a1798c9f79465c74d565e92904b

How to check if program was compiled with debug symbols? [duplicate]

https://stackoverflow.com/questions/3284112/how-to-check-if-program-was-compiled-with-debug-symbols

VSCode debug cpp ROS node - compile package with debug mode

https://answers.ros.org/question/313371/vscode-debug-cpp-ros-node/

C/C++: How do you set GDB debug flag (-g) with cmake?

https://bytefreaks.net/programming-2/cc-how-do-you-set-gdb-debug-flag-g-with-cmake

相关文章:

【工具】使用VS Code调试Docker Container中的代码

目录 使用VS Code调试Docker Container中的Autoware.ai代码第一种方法 -- 在VS Code中进行DebugStep1Step2Step3Step4c_cpp_properties.jsonlaunch.jsonsettings.jsontask.json Step5Step6Step7参考链接 第二种方法 -- cmake重新编译cmake使用方法&#xff08;简介&#xff09;…...

ZVL3网络分析仪

ZVL3 Rohde&Schwarz ZVL3 3G矢量网络分析仪|罗德与施瓦茨 9KHz至3GHz 罗德与施瓦茨Rohde&Schwarz 性能特点&#xff1a; 频率范围 9kHz至3GHz/6 GHz(典型值为5kHz) 测量时间(201个测量点&#xff0c;以校准的双端口) <75ms 数据传输(201个测量点) 在100Mbit/sLAN…...

TCP协议

传输层&#xff08;协议&#xff09; TCP协议 三次握手协议保证连接建立 四次挥手&#xff0c;利用这个协议断开连接&#xff0c;而且保证连接通道里面数据已经处理完毕 客户端&#xff08;Socket&#xff09;: 1、创建客户端的Socket对象&#xff08;Socket&#xff09;与指…...

69. x 的平方根

给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1&#xff1…...

Webshell应急响应指南

Webshell应急响应指南 1.Webshell 排查2.入侵时间确定3.Web日志分析4.漏洞分析5.漏洞复现6.清除Webshell并修复漏洞7.Webshell 防御方法1.Webshell 排查 可利用 Webshell 扫描工具(如 D 盾,河马)对应用部署目录进行扫描,如网站D:\WWW\目录 或者将当前网站目录文件与此前备…...

Linux如何定时执行任务

目录 crontab 介绍 安装crontab 服务操作说明 操作案例 crontab 介绍 Linux crontab是采用定期执行程序的命令&#xff0c;当安装完成操作 系统后&#xff0c;默认便会启动此任务调度命令&#xff0c;crond命令每分钟都会定期检查是否要执行任务的工作&#xff0c;如果要执…...

使用nvm替换nvmw作为nodejs的版本切换(亲测)

之前的文章&#xff1a;同时使用vue2.0和vue3.0版本的采坑记录 安装的nvmw&#xff0c;今天想要用nvmw切换时&#xff0c;居然给我报错了&#xff1a; 然后我就走上了使用nvm替换nvmw之路。。 1.安装 nvm-windows下载 下载release版 中Assets中的包&#xff0c;window10&…...

分布式事务

数据库事务 Atomicity 原子性 某个操作&#xff0c;要么全部执行完毕&#xff0c;要么全部回滚 Consistency 一致性 数据库中的数据全都符合现实世界的约束&#xff0c;则这些数据就符合一致性。 比如性别约束男or女&#xff0c;人名币面值不能为负数&#xff1b;出生地址不能…...

zk111111111111111111

Zookeeper 1 zookeeper(作为 dubbo 的注册中心): 概述: zookeper 是 一个分布式的、开源的分布式应用程序的协调服务,管理分布式应 用 作用: 配置管理,分布式锁,集群管理 2 zookeeper 的安装 (dubbo 的资料中已经整理) 3 zookeeper 的数据模型 zookeeper 是一个树形的服…...

018:Mapbox GL加载Google地图(影像瓦片图)

第018个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载google地图。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共80行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:https://xia…...

Web API 和 API 的区别编写api

编写api 自从Roy Fielding博士在2000年他的博士论文中提出&#xff08;Representational State Transfer&#xff09;风格的软件架构模式后&#xff0c;REST就基本上迅速取代了复杂而笨重的SOAP&#xff0c;成为Web API的标准了。 什么是Web API呢&#xff1f; 1. Web API 和…...

IDEA 用上这款免费 GPT4 插件,生产力爆表了

大家好&#xff0c;我是一航&#xff01; 早前给大家分享过GPT的一些玩法&#xff0c;但是依旧有很多铁子没有掌握魔法的奥秘&#xff0c;始终没有用上&#xff1b;前两天&#xff0c;一兄台分享给我一款 IDE 插件&#xff1a;Bito-ChatGPT &#xff0c;安装就能直接在IDE中使…...

1187.使数组严格递增 学习记录

题目描述 给你两个整数数组 arr1 和 arr2&#xff0c;返回使 arr1 严格递增所需要的最小「操作」数&#xff08;可能为 0&#xff09;。 每一步「操作」中&#xff0c;你可以分别从 arr1 和 arr2 中各选出一个索引&#xff0c;分别为 i 和 j&#xff0c;0 < i < arr1.l…...

权限控制_SpringSecurity

认证-授权 认证&#xff1a;系统提供的用于识别用户身份的功能&#xff0c;通常提供用户名和密码进行登录其实就是在进行认证&#xff0c;认证的目的是让系统知道你是谁。 授权&#xff1a;用户认证成功后&#xff0c;需要为用户授权&#xff0c;其实就是指定当前用户可以操作…...

2023年最系统的自动化测试,测试开发面试题,10k以下不建议看

鉴于现在严峻的就业形势&#xff0c;千万大学生即将出新手村&#xff0c;今天给大家打包好了2023最能避免薪资倒挂的《面试圣经》。不经一番寒彻骨,怎得梅花扑鼻香。这份面试题&#xff0c;与君共勉&#xff01; 一、开场白 Q&#xff1a;简单自我介绍一下吧 Q&#xff1a;项…...

今年SMETA审核费用即将涨价

【今年SMETA审核费用即将涨价】 SMETA全称&#xff08; Sedex Members Ethical Trade Audit &#xff09;&#xff0c;即Sedex会员社会道德贸易审核&#xff0c;它是Sedex发起的一种负责任的供应链审计方法/项目。 Sedex是一个全球性的责任商业平台&#xff0c;SMETA是审核方法…...

基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

基于深度学习和生理信号的疾病筛查:个体内和个体间研究的价值与应用

一、引言 随着深度学习技术的飞速发展&#xff0c;基于生理信号的疾病筛查和诊断方法在医学领域得到了广泛应用。这些方法通常利用个体内和个体间的生理信号数据&#xff0c;通过训练深度学习模型实现疾病的自动识别和预测。本文将讨论个体内和个体间研究在这一领域的价值和应…...

现在有t1,t2,t3三个线程,实现t1,t2线程同步执行,然后再执行t3线程,使用Java实现该程序

目录 1、利用CountDownLatch 2、利用Future 最近在面试的时候&#xff0c;经常遇到这个题目&#xff0c;首先从题目上看&#xff0c;就知道考察的是多线程方面知识&#xff0c;我第一次看到这个题目的时候&#xff0c;就想到了使用CountDownLatch这个计数器来实现&#xff0c…...

83.qt qml-初步学习2D粒子影响器(二)

由于QmlBook in chinese翻译过来的文字有些比较生疏难于理解,所以本章在它的基础上做些个人理解,建议学习的小伙伴最好配合QmlBook in chinese一起学习。 QML粒子所有类型: Qt Quick Particles QML Types | Qt Quick 6.5.0 Affector类型: Attractor QML Type | Qt Quick 6.5.…...

4.17-4.18学习总结

MD5 MD5: 1、压缩性 2、容易计算 3、抗修改性 4、弱抗碰撞 5、强抗碰撞 为什么需要MD5&#xff1f; 存储一些敏感信息的时候&#xff0c;如果不进行加密会出现安全问题。 例如&#xff1a;系统登录的密码&#xff0c;如果数据库中的密码采用明文&#xff0c;一旦数据库泄…...

Spring事务

事务作用&#xff1a; 事务作用&#xff1a;在数据层保障一系列的数据库操作同成功同失败Spring事务作用&#xff1a;在数据层或 业务层 保障一系列的数据库操作同成功同失败 Spring为了管理事务&#xff0c;提供了一个平台事务管理器PlatformTransactionManager commit是用来提…...

Linux新的设备或分区挂载到系统中mount使用方法

如果想将一个新的设备或分区挂载到系统中&#xff0c;可以按照以下步骤进行操作&#xff1a; 确定要挂载的设备或分区的设备名&#xff0c;例如 /dev/sdb1。 创建挂载点&#xff0c;可以在任何目录下创建一个新目录作为挂载点&#xff0c;例如 /mnt/mydevice。 sudo mkdir /mn…...

移动硬盘损坏如何恢复数据

移动硬盘一种小巧便携的存储介质&#xff0c;可用于各电脑之间交换大容量数据&#xff0c;可以随时插拔&#xff0c;进行高速传输数据。但有好也有坏&#xff0c;在我们使用中也会出现一些移动硬盘损坏故障&#xff0c;比如说提示格式化、硬盘分区丢失、误格式化、文件误删除等…...

Material Design:为你的 Android 应用提供精美的 UI 体验

Material Design&#xff1a;为你的 Android 应用提供精美的 UI 体验 介绍 Material Design 概念&#xff1a;介绍 Material Design 是 Google 推出的一种设计语言&#xff0c;用于创建现代、美观、直观且一致的用户界面。解释 Material Design 的基本原则&#xff0c;包括材料…...

springboot+vue学生毕业离校系统(源码+说明文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的学生毕业离校系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风…...

【Android入门到项目实战-- 6.2】—— 如何访问其他应用程序的数据?

目录 一、ContentResolver基本用法 如何查询&#xff1f; 如何向表中添加一条数据&#xff1f; 如何更新这条新添加的数据&#xff1f; 如何删除这条数据&#xff1f; 二、读取系统联系人 要想你的APP访问其他应用程序的数据&#xff0c;需要使用内容提供器&#xff0c;下面使…...

【100个 Unity实用技能】 | InputField输入框组件实现输入限制,只能输入中文或特殊字符等

&#x1f3ac; 博客主页&#xff1a;https://xiaoy.blog.csdn.net &#x1f3a5; 本文由 呆呆敲代码的小Y 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;Unity系统学习专栏 &#x1f332; 游戏制作专栏推荐&#xff1a;游戏制作 &…...

倍数+路径之谜

倍数 :用户登录https://www.lanqiao.cn/problems/583/learning/?page5&first_category_id1&sortstudents_count 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 请问在 1 到 2020 中&#xff0c;有多少个…...

【Unity渲染】URP透明物体自身渲染穿插异常问题

背景&#xff1a; 对于URP中的某个物体&#xff0c;我们如果希望他正反面都可以被渲染。 通常会有两种解决方案&#xff1a; 1.将网格设置为双面网格。&#xff08;此种情况Mesh.RecalculateNormals计算结果可能会异常&#xff0c;解决可参考网格法线生成异常解决&#xff0…...