vscode调试container中的程序的方法步骤

 更新时间:2022年03月20日 10:03:12   作者:passenger12234  
本文主要介绍了vscode调试container中的程序的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在写cmu14-445的project时,我希望在本地vscode编辑代码,然后在docker中编译和测试代码。但是如果测试出了问题,直接在本地调试就变得麻烦了。所以希望利用vscode进行远程调试。

参考官方文档,利用ssh + pipeTransport来完成,下面是我的launch.jsontasks.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": [
    {
      "name": "g++-9 - Build and debug active file",
      "type": "cppdbg",
      "request": "launch",
      "program": "./build/test/${fileBasenameNoExtension}",
      "args": [],
      "stopAtEntry": false,
      "sourceFileMap":{
        "/bustub": "${workspaceFolder}"
        /*remote src directory : local src directory*/
        /*文档里说这个是为了便于debugger找源码*/
      },
      "cwd": "/bustub",
      "environment": [],
      "pipeTransport": {
        "pipeCwd": "/usr/bin",
        "pipeProgram": "ssh",
        "pipeArgs": [
          "root@172.17.0.2"
        ],
        "debuggerPath": "/usr/bin/gdb"
      },
      "externalConsole": false,
      "MIMode": "gdb",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ],
      "preLaunchTask": "C/C++: g++-9 build active file",
      "miDebuggerPath": "/usr/bin/gdb"
    }
  ]
}
{
  "tasks": [
    {
      "type": "shell",
      "label": "C/C++: g++-9 build active file",
      "command": "ssh",
      "args": [
        "root@172.17.0.2",
        "cd /bustub/build && make ${fileBasenameNoExtension}"
      ],
      "group": {
        "kind": "build",
        "isDefault": true
      },
      "detail": "Task generated by Debugger."
    }
  ],
  "version": "2.0.0"
}

编译时利用ssh,在docker的终端中进行编译。而在launch.json中利用ssh作为pipeProgram,传递调试信息(虽然原理我也不太懂就是了)。172.17.0.2是container的IP地址。

为了保证主机能够直接通过ssh登录container,需要修改一下dockerfile文件。最终我的dockerfile文件长这样:

FROM ubuntu:18.04

# Install Ubuntu packages.
# Please add packages in alphabetical order.
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get -y update && \
    apt-get -y install \
      build-essential \
      clang-8 \
      clang-format-8 \
      clang-tidy-8 \
      cmake \
      doxygen \
      git \
      g++-7 \
      pkg-config \
      valgrind \
      zlib1g-dev \
	  ssh
RUN echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config && \
    echo 'PermitEmptyPasswords yes' >> /etc/ssh/sshd_config && \
    echo 'PasswordAuthentication yes' >> /etc/ssh/sshd_config && \
	echo 'PubkeyAuthentication yes' >> /etc/ssh/sshd_config && \
	mkdir /root/.ssh

COPY ./id_rsa.pub /root/.ssh/authorized_keys

CMD service ssh start && git config --global http.proxy "http://192.168.31.1:7890" && bash

修改的地方主要是安装ssh,然后把本地公钥copy过去,注意copy命令只能copy当前context下的文件,所以需要先复制一份公钥到源码目录中。然后CMD中显式启动ssh service。并且配置git代理(不然有时候clone github会失败)。

docker启动该镜像的时候就不要显式指定命令了,不然这样会覆盖默认的CMD指令。

最后还需要改一下.dockerignore文件,原来的.dockerignore文件会忽略源码目录下所有文件,导致COPY命令出错。OK,这样就可以愉快地在本地vscode下面调试container里面的程序了。

update:

发现上面的远程调试的方法挺麻烦的,vscode的docker插件提供了直接把vscode attach到container里的方法,然后直接在vscode里面调试就行了。这个方法唯一的弊端是每次开启容器后,都需要在容器中重新安装一次vscode的插件

在bustub容器里装了一波C++的插件,因为bustub的根目录中已经有一个CmakeLists.txt,自动就配置好啦!

在这里插入图片描述

可以在vscode最下方的状态栏中选择cmake的build参数,比如我希望运行buffer_pool_manager_instance_test,选择相应的build对象,然后点击图上的小虫就可以断点调试了。

另外,之前用lldb调试的时候有如下报错

error: 'A' packet returned an error: 8

需要在运行容器时加上--security-opt seccomp=unconfined 参数,允许容器内的程序执行全部系统调用。

到此这篇关于vscode调试container中的程序的方法步骤的文章就介绍到这了,更多相关vscode调试container内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Websocket直播间聊天室教程  GoEasy快速实现聊天室

    Websocket直播间聊天室教程 GoEasy快速实现聊天室

    这篇文章主要介绍了Websocket直播间聊天室教程 GoEasy快速实现聊天室,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 在kali上安装AWVS的图文教程

    在kali上安装AWVS的图文教程

    这篇文章主要介绍了在kali上安装破解AWVS的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • 程序员学英语的一个方法

    程序员学英语的一个方法

    这篇文章主要介绍了程序员学英语的一个方法,程序员学习英语是很有必要的,只要坚持下去,相信必有收获,需要的朋友可以参考下
    2014-08-08
  • 超详细Windows下VSCode安装教程

    超详细Windows下VSCode安装教程

    本文通过图文并茂的形式给大家介绍Windows下VSCode安装教程,感兴趣的朋友跟随小编一起看看吧
    2023-11-11
  • Git别名的使用

    Git别名的使用

    这篇文章主要介绍了Git别名的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 使用git代替FTP部署代码到服务器的例子

    使用git代替FTP部署代码到服务器的例子

    这篇文章主要介绍了使用git代替FTP部署代码到服务器的例子,这种方法可以节省流量、节省时间,需要的朋友可以参考下
    2014-09-09
  • 2020年最火的6种编程语言推荐

    2020年最火的6种编程语言推荐

    当下计算机编程语言总数达到好几万种,但是最流行的编程语言有哪些呢,今天,小编就给大家盘点一下2020年很受欢迎的编程语言,感兴趣的朋友一起看看吧
    2020-07-07
  • git如何拉取指定分支代码

    git如何拉取指定分支代码

    本文介绍了三种使用Git操作代码仓库的方法:首先是克隆整个仓库后切换至指定分支,其次是在克隆时直接指定分支,最后是在本地空仓库中拉取指定分支的代码,每种方法适用于不同的场景,帮助用户灵活高效地管理代码
    2024-10-10
  • git之远程代码回滚master问题

    git之远程代码回滚master问题

    这篇文章主要介绍了git之远程代码回滚master问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • git cherry-pick的具体使用

    git cherry-pick的具体使用

    Git cherry-pick用于将特定提交从其他分支应用到当前分支,常用于多分支开发中的部分提交转移,本文就来介绍一下解决方法,感兴趣的可以了解一下
    2024-09-09

最新评论