vscode linux 远程 go 调试环境

本贴最后更新于 601 天前,其中的信息可能已经时移世改

不建议用 vscode 开发 go 的大项目。
远程 linux 环境是 wsl2-ubuntu20,原理上基本是一致。
习惯用 vscdoe 工作区统一配置设置和插件,再写一个同一个通用的 task、launch 模板,但是每个项目(文件夹)的 task 和 lauch 单独配置(因为不同项目 args、参数、环境要单独设置)。

  1. 远程机器。配置 go env,国内的网络建议配置 GOPROXY="https://goproxy.cn/,direct",不然后续下载 go tools 和包很慢。
  2. vscode 远程连接机器,安装 go 官方插件。安装 go 工具(vscode 中 ctrl + shift + p 搜索 go install
  3. 工作区设置。
    "settings": {
    		"go.inferGopath": false,	// 用的是go mod(go>1.11),所以没有配置
    		"editor.tabSize": 4,
    		"editor.insertSpaces": false,
    		"go.docsTool": "godoc", // gopls下无影响
    		// "go.buildOnSave": "workspace",
    		"editor.detectIndentation": false,
    		"go.formatTool": "default", // gopls下不影响
    		"[go]": {
    			"editor.insertSpaces": false,
    			"editor.tabSize": 4,
    			"editor.formatOnSave": true,
    			"editor.codeActionsOnSave": {
    				"source.organizeImports": true	// 保存时自动import
    			},
    			"editor.suggest.snippetsPreventQuickSuggestions": false
    		},
    		"go.toolsManagement.checkForUpdates": "proxy", // 提示go或go tools的版本更新,我配置了goproxy
    		"go.useLanguageServer": true,
    		"go.languageServerFlags": [
    			"-rpc.trace", // for more detailed debug logging
    		],
    		"gopls": {
    			"ui.completion.usePlaceholders": false,
    			// "usePlaceholders": true, // add parameter placeholders when completing a function
    			"completeUnimported": true, // autocomplete unimported packages
    			"deepCompletion": true, // enable deep completion
    		},
    		"terminal.explorerKind": "integrated",
    	},
    

目前 gopls 已经稳定了,内存占用差不多 300M 以内。

➜ procs gopls
 PID:▲ PPID │ User  │ CPU    VmRSS │ TCP │ Command
            │       │ [%]  [bytes] │     │
 4439  4228 │ bingo │ 0.0 210.832M │  [] │ ${GOPATH}/bin/gopls -mode=stdio -rpc.trace
  1. 准备 task 和 launch 模板,参考了官方文档

    • task.json

      {
      	"version": "2.0.0",
      	"cwd": "${workspaceFolder}",
      	"tasks": [
      		{
      			// 最终的编译
      			"label": "linux : go build",
      			"command": "go",
      			"args": [
      				"build",
      				"-o",
      				"bin/${workspaceFolderBasename}", // 编译对应的目录
      			],
      			"group": {
      				"kind": "build",
      			}
      		},
      		{
      			// 调试的编译
      			"label": "linux : go build(debug)",
      			"type": "shell",
      			"command": "go",
      			"args": [
      				"build",
      				"-gcflags=all=-N -l", // -N 禁用优化 -l 禁用内联
      				"-o",
      				"bin/__debug_${workspaceFolderBasename}",
      			],
      			"group": "build",
      		},
      		{
      			"label": "linux : go test(debug)",
      			"type": "shell",
      			"command": "go",
      			"args": [
      				"test",
      				"-c",
      				"-o",
      				"bin/__test_${workspaceFolderBasename}",
      			],
      			"group": "test",
      		},
      		{
      			// 远程终端内调试和相关的后面launch.json中要求一致
      			// 如果是root用户可以不用sudo
      			"label": "dlv start",
      			"type": "shell",
      			"command": "sudo",
      			"args": [
      				"dlv",
      				"dap",
      				"--listen=127.0.0.1:12345",
      				"--log-dest=3",
      				"--only-same-user=false"
      			],
      			"group": "build"
      		}
      	],
      }
      
    • launch.json

      Launch: fastDebug,使用用默认的调试控制台,缺点是不能输入,不过 F5 运行是非常的方便。剩下两个是当程序要模拟终端输入时,先 ctrl + shift +b 运行 task 中 dlv dap 服务器。
      对于已运行的 go 程序,可以用 attach 模式。

      {
      	// 使用 IntelliSense 了解相关属性。 
      	// 悬停以查看现有属性的描述。
      	// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
      	// 远程调试前必须先启动dlv
      	// sudo dlv dap   --listen=127.0.0.1:12345 --log-dest=3 --only-same-user=false
      	"version": "0.2.0",
      	"configurations": [
      		{
      			"name": "goDebug",
      			"type": "go",
      			"debugAdapter": "dlv-dap",
      			"preLaunchTask": "linux : go build(debug)", // 预先调用编译
      			"request": "launch",
      			"mode": "exec",
      			"asRoot": true, // 以root用户执行
      			"port": 12345,
      			"host": "127.0.0.1",
      			"program": "bin/__debug_${workspaceFolderBasename}",
      			"cwd": "${workspaceFolder}",
      			"env": {
      				"GO111MODULE": "auto" // 使用go mod
      			},
      			"args": [],
      		},
      		{
      			"name": "goTest",
      			"type": "go",
      			"debugAdapter": "dlv-dap",
      			"request": "launch",
      			"preLaunchTask": "linux : go test(debug)", // 语调调用编译
      			"mode": "exec",
      			"asRoot": true,
      			"port": 12345,
      			"host": "127.0.0.1",
      			"program": "bin/__test_${workspaceFolderBasename}",
      			"cwd": "${workspaceFolder}",
      			"env": {
      				"GO111MODULE": "auto"
      			},
      			"args": [],
      		},
      		{
      			"name": "fastDebug",
      			"type": "go",
      			"debugAdapter": "dlv-dap",
      			"request": "launch",
      			"mode": "debug",
      			"asRoot": true, // 以root用户执行
      			"program": "${workspaceFolder}",
      			"cwd": "${workspaceFolder}",
      			"env": {
      
      				"GO111MODULE": "auto"
      			},
      			"args": [],
      		}
      	]
      }
      
      
  2. 在 go 工作区中添加项目(文件夹),将 task 和 launch 模板拷贝到项目下的 .vscode 目录下,然后就是用 go mod init 初始化项目了。(go mod 相关的操作其实也可以考虑配置成 task)

  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    491 引用 • 1383 回帖 • 368 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 11 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 628 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 423 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    710 引用 • 1173 回帖 • 179 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 426 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 492 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 23 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 642 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    51 引用 • 190 回帖
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖 • 4 关注
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 132 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 496 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 345 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    21 引用 • 58 回帖
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    10 引用 • 85 回帖 • 1 关注
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    310 引用 • 1666 回帖 • 1 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 24 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    675 引用 • 535 回帖 • 1 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖 • 38 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 247 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    284 引用 • 4481 回帖 • 655 关注
  • 安装

    你若安好,便是晴天。

    128 引用 • 1184 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    6485 引用 • 29159 回帖 • 248 关注