【问题标题】:Visual Studio Code Debug: source and then launch on same shellVisual Studio 代码调试:源代码然后在同一个 shell 上启动
【发布时间】:2020-02-05 21:44:18
【问题描述】:

我当前的项目工作流程如下:

  • 构建项目(通过 catkin)
  • 获取 setup.sh 脚本(由 catkin 生成,我不想修改)设置环境变量和可执行文件所需的名称。
  • 运行“MyProgram”,它仅在获取“setup.sh”脚本后可用。

我希望能够在 Visual Studio Code 中调试我的项目。为此,我定义了一个通过 catkin 构建可执行文件的任务,名为“catkin build all”,并将第二个任务定义为:

{
  "type": "shell",
  "label": "load programs",
  "command": "source /some_folder/setup.sh",
  "group": "build",
  "dependsOn": ["catkin build all"]
}

这是我的 lanuch.json 启动配置的“preLaunchTask”。

启动调试将正确编译项目,但执行失败并出现错误“启动:程序 myProgram 不存在”。如果 setup.sh 不是来源,则确实无法找到程序 MyProgram,但应该由“preLaunchTask”提供。

在我的 launch.json 中,我还可以将“program”设置为“/full/path/to/myProgram”而不是“myProgram”,但在这种情况下找不到共享库,因为 setup.sh 会处理那个。

我也尝试在 shell 上获取 setup.sh,然后从同一个 shell 启动 Visual Studio 代码,但这并没有解决“启动:程序 myProgram 不存在”的问题。

任务是否在不同的 shell 上运行?如何让 preLaunchTask 在与后续程序代码相同的 shell 中运行?或者关于如何让我的工作流程正常工作的任何其他提示?

【问题讨论】:

  • 奇怪的是你为什么隐瞒你正在使用 ROS ? “setup.sh”、catkin_make 和启动文件的行为……是特定于 ROS 的。此外,我们没有关于您的流程的具体信息。你怎么能期待一个如此神秘的答案?准确说明你做了什么,你是如何执行你的任务的(通过 roslaunch ?别的东西?),启动文件的内容是什么,......我们无法猜测你做了什么。此外请记住,采购 devel.sh 只会影响当前的 shell 控制台。
  • 我没有使用 ros 的经验,也没有设置我正在使用的工作流程。我编写了一个普通的 CMake 库,然后将其集成到 ros/catkin 项目中。我没有描述 ROS 部分,因为我不知道如何正确地做到这一点。我只是想知道是否有一种方法可以让 Visual Studio 代码源“setup.sh”,然后在同一个 shell 控制台上运行 myProgram,而不是据我所知,在单独的 shell 控制台中运行。
  • 嗯,我明白了。我建议您关注ros tutorials,以便更好地了解您在做什么。您至少可以从第 1 步到第 16 步(您可以忽略 python 部分)进行初学者级别。无需更进一步(但如果你愿意,你可以)。本教程内容丰富,易于阅读(和复制),并且在过去处理 ROS 时帮助了我很多。我敢打赌这对你也会有很大的帮助:)

标签: c++ visual-studio-code gdb ros catkin


【解决方案1】:

我的解决方案是使用 env_file

在一个终端中,获取您的文件,例如:source /opt/ros/melodic/setup.bash

使用以下命令恢复更改:printenv | grep melodic

使用环境变量在您的仓库中创建一个.env 文件; (残疾人除外)

LD_LIBRARY_PATH=/opt/ros/melodic/lib
ROS_ETC_DIR=/opt/ros/melodic/etc/ros
CMAKE_PREFIX_PATH=/opt/ros/melodic
ROS_ROOT=/opt/ros/melodic/share/ros
PYTHONPATH=/opt/ros/melodic/lib/python2.7/dist-packages
ROS_PACKAGE_PATH=/opt/ros/melodic/share
PATH=/opt/ros/melodic/bin:/home/alexis/.nvm/versions/node/v8.16.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
PKG_CONFIG_PATH=/opt/ros/melodic/lib/pkgconfig
ROS_DISTRO=melodic

将以下行添加到您的 launch.json 任务中:"envFile": "${workspaceFolder}/.env"

注意:这可以在 prerunTask 中自动使用:

command: "source /opt/ros/melodic/setup.bash; printenv | grep melodic > ${workspaceFolder}/.env"

【讨论】:

  • 实际上并不在运行 shell 中提供源代码,我会接受这样做的答案或提供无法完成的证据。但绝对是为我的案例做的伎俩,让我调试 VS 代码,所以 +1 和赏金是你的。
  • @Alexis Paques 当我运行 python3 并尝试导入 tf 模块时,这对我来说工作正常。最重要的部分是 PYTHONPATH,所以我使用了"source /opt/ros/melodic/setup.bash; printenv | grep PYTHONPATH > ${workspaceFolder}/.env"。无论如何,谢谢,但为什么 python 调试控制台不来源 .bashrc?这对我来说是一个问题。也许它没有作为登录终端打开。
  • 可能的原因是这根本不使用 Bash 来执行命令。您可以尝试将source /opt/ros/melodic/setup.sh 添加到您的~/.profile,这应该可用于整个会话。 (要对其进行测试,您必须注销并登录)。如果它有效,它的坏处将是环境污染。我正在使用多个版本的 ROS/ROS2 和许多不同的工作区。
【解决方案2】:

也许这在缩放后可能会有所帮助。 here获得该信息

【讨论】:

  • 谢谢,不幸的是这并不能解决我的问题。我的 setup.sh 将我的可执行文件“myProgram”的文件夹添加到 PATH 并设置共享库的路径。同样通过您提出的更改,如果我尝试使用“program”="MyProgram" 运行,VScode 仍然会抱怨找不到 myProgram。如果我设置 "program"="/full/path/to/myProgram" VScode 程序将找不到共享库,就好像 setup.sh 来自一个单独的 shell w.r.t。用于催款 myProgram 的那个。在普通的 shell 中,调用 source setup.sh 然后 MyProgram 将正常运行。
  • 根据一些 ros2 foxy Python 模块运行 Python 脚本时为我工作。
  • @ignacio 这对我不起作用。使用 Linux ubuntu 18.04 并安装了 Python2.7 和 Pyhton 3.6.x,当我将此预运行应用到我的 python 文件(python3)时,即使我采购了 tf 模块,我也无法导入它。每次按 F5 时,我都必须从 Python 调试控制台手动获取它。
猜你喜欢
  • 2015-08-04
  • 2011-10-11
  • 2023-03-15
  • 2017-05-17
  • 2020-07-30
  • 2013-02-17
  • 2023-01-30
  • 1970-01-01
  • 2018-09-26
相关资源
最近更新 更多