IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> vscode调试container中的程序 -> 正文阅读

[开发工具]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 参数,允许容器内的程序执行全部系统调用。

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:19:41  更:2022-03-06 13:19:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:31:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码