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

news2025/1/15 6:49:27

目录

  • 使用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

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

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

相关文章

SPARQL endpoint with Ontop CLI部署,python使用SPARQLWrapper

Ontop CLI部署&#xff0c;避免踩坑 0.前言1.提示2.详细部署流程3.python操作4.碎碎念 0.前言 教程&#xff1a;Setting up an Ontop SPARQL endpoint with Ontop CLI照着教程来&#xff0c;不知道为啥&#xff0c;总是报错&#xff0c;后来发现&#xff0c;手机搜到的跟电脑不…

Mybatis模糊查询——三种定义参数方法和聚合查询、主键回填

目录 相关导读 一、使用#定义参数 1. 持久层接口添加根据名字内容模糊查询方法 2. UserMapper.xml映射文件添加标签 3. 添加测试方法 4. 运行结果 二、使用$定义参数 1. UserMapper.xml映射文件更改标签内容 2. 修改测试方法 3. 运行结果 三、使用标签定义参数 1. …

JavaWeb开发 —— MyBatis入门

目录 一、快速入门程序 二、配置SQL提示 三、JDBC 四、数据库连接池 五、lombok工具包 MyBatis是一款优秀的 持久层Dao层 框架&#xff0c;用于简化JDBC的开发。 MyBatis本是 Apache的一个开源项目iBatis, 2010年这个项目由apache迁移到了 google code&#xff0c;并且改…

企业为什么都需要产品手册?

随着科技的不断发展和市场竞争的日益激烈&#xff0c;企业在推广和销售产品时需要给客户提供更多的信息和保障&#xff0c;而产品手册就成为了必不可少的工具之一。本文将从以下几个方面详细介绍企业为什么都需要产品手册。 产品手册的定义和作用 产品手册是一本介绍企业产品…

【C++初阶】:指针空值nullptr

指针空值nullptr 一.空指针二.空指针nullptr 一.空指针 在良好的C/C编程习惯中&#xff0c;声明一个变量时最好给该变量一个合适的初始值&#xff0c;否则可能会出现不可预料的错误&#xff0c;比如未初始化的指针。如果一个指针没有合法的指向&#xff0c;我们基本都是按照如下…

无人机巡检智能一体化解决方案

随着无人机技术的不断发展&#xff0c;无人机应用领域已经越来越生活化&#xff0c;其产品不仅在军事、商业等领域得到了广泛应用&#xff0c;也在普通人的生活中得到了广泛应用。无人机的自动巡检是无人机应用的一个重要方向&#xff0c;具有广阔的发展前景&#xff0c;本文将…

太阳的G2

我已经忘记是怎么喜欢上保罗的 入职腾讯的第一天&#xff0c;同事看到我的英文名cris&#xff0c;就笃信我应该是保罗的球迷。 是的&#xff0c;我是保罗的球迷「当然&#xff0c;不只是保罗的球迷」。 14-15赛季&#xff0c;保罗在的快船跟马刺鏖战7场&#xff0c;硬是在第7场…

NumberPicker分析(二)

NumberPicker分析(二) NumberPicker继承自LinearLayout。一般而言&#xff0c;无论是继承自View&#xff0c;还是继承自ViewGroup&#xff0c;必然会经过如下的几个阶段&#xff1a; onMeasureonLayoutonDraw onMeasure 在onMeasure方法测量当前控件大小&#xff0c;为正式…

Faster RCNN系列2——RPN的真值与预测值概述

Faster RCNN系列&#xff1a; Faster RCNN系列1——Anchor生成过程 Faster RCNN系列2——RPN的真值与预测值概述 Faster RCNN系列3——RPN的真值详解与损失值计算 Faster RCNN系列4——生成Proposal与RoI Faster RCNN系列5——RoI Pooling与全连接层 对于目标检测任务&#xf…

Replicator简介

Replicator 文章目录 ReplicatorReplicator简介合成数据训练背后的理论Replicator核心组件已知的问题 Replicator简介 Omniverse Replicator 是一个高度可扩展的框架&#xff0c;构建在可扩展的 Omniverse 平台上&#xff0c;可生成物理上准确的 3D 合成数据&#xff0c;以加速…

传输线的物理基础(十):特性阻抗的频率变化

到目前为止&#xff0c;我们一直假设传输线的特性阻抗随频率保持不变。正如我们所见&#xff0c;从传输线前端看&#xff0c;输入阻抗与频率密切相关。毕竟&#xff0c;在低频时&#xff0c;远端开路的传输线的输入阻抗看起来像一个电容器&#xff0c;阻抗开始很高&#xff0c;…

JavaScript中的执行上下文和执行栈

执行上下文概念以及理解 执行上下文是评估和执行JavaScript代码环境的抽象概念&#xff0c;但我们在JavaScript中所做的声明变量&#xff0c;声明函数&#xff0c;执行函数。他们都是在执行上下文中运行&#xff0c;也有了所谓的作用域。 执行上下文的类型 执行上下文分为三…

创建vite+vue+electron项目

写在前面的废话 首先&#xff0c;这是一篇缝合文&#xff0c;我的目的就是想用vite、vue结合electron打包一个windows应用&#xff1b;其次&#xff0c;项目只是这三个工具的简单应用&#xff0c;目前还没有往里面添加其他内容。再次&#xff0c;项目过程中参考了google的多篇文…

执行数学的运算

数学是计算机编程的重要能力。遗憾的是&#xff0c;对shell脚本来说&#xff0c;这个处理过程比较麻烦。在shell脚本中两种途径来进行数学运算。 expr命令 最开始&#xff0c;Bourne shell提供了一个特别的命令用来处理数学表达式。expr命令允许在命令行上处理数学数学表达式。…

EMQX vs VerneMQ | 2023 MQTT Broker 对比

引言 EMQX 和 VerneMQ 都是用 Erlang/OTP 开发的高性能、分布式开源 MQTT Broker&#xff0c;以其稳定性、容错性和扩展性著称。 EMQX 是目前全球最受欢迎的 MQTT Broker 之一&#xff0c;而 VerneMQ 项目近年来却没有积极地开发和维护。 本文是《2023 年 MQTT Broker 对比》…

可视化电子标签在仓储管理上的应用

随着经济快速增长和激烈的国内外市场竞争&#xff0c;要求企业运作的每个环节反应要迅速&#xff0c;经济转型要求更趋向改善工作流程、提高作业效率、减低运作成本、增加企业效益成为当务之急。虽然许多企业都有实施库存管理系统&#xff0c;但系统主要以人工盘点和走单据流程…

请收下这些软件测试学习干货,不看后悔一辈子

学习软件测试的过程中会遇到很多很多的困难和挑战&#xff0c;只有跨过这些困难和挑战&#xff0c;才有机会挑战软件测试领域的高薪offer。今天我们就来梳理一下&#xff0c;学习软件测试的过程中&#xff0c;我们一般都会遇到哪些困难&#xff0c;我们又当如何克服这些困难。 …

ChatGPT/大模型+零代码,给中小企业带来哪些机会?

ChatGPT让2023年成了AI之年。正如iPhone在2007年开启了智能手机时代&#xff0c;我们现在正在进入人工智能时代。 新形势下&#xff0c;零代码应如何借势发力&#xff1f;伙伴云“AI零代码”给出了答案。 作为零代码领域的头部平台&#xff0c;伙伴云全量发布【AI零代码应用搭…

暖通空调系统智能化故障检测诊断研究综述与展望

暖通空调系统智能化故障检测诊断研究综述与展望 【摘 要】暖通空调系统智能化化故障检测与诊断对提高运维水平和能源效率具有重要意义。 本文总结了暖通空调故障检测与诊断领域近二十多年来的研究历程&#xff0c;探讨了基于规则、基于模型和基于数据等三类主流方法的优劣&…

一键生成!如何为整个go项目自动添加单测

效果 为go项目中每个go文件生成对应的test文件&#xff0c;为每个接口生成对应的单测接口。 类似于这样&#xff0c;为go项目中每个包都生成一个test文件&#xff0c;单测模板如下&#xff1a; 比如函数接口为func releaseEndpoint(instanceID string, endpointID string) er…