vscode linux 远程 go 调试环境

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

不建议用 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 发布的第二款编程语言。

    493 引用 • 1385 回帖 • 343 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 608 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 139 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    138 引用 • 268 回帖 • 147 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    51 引用 • 226 回帖
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 4 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 614 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    6 引用 • 15 回帖 • 186 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    124 引用 • 580 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3169 引用 • 8208 回帖
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 437 关注
  • Ngui

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

    7 引用 • 9 回帖 • 354 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    35 引用 • 35 回帖 • 3 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 21 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    45 引用 • 25 回帖 • 1 关注
  • 创业

    你比 99% 的人都优秀么?

    83 引用 • 1398 回帖
  • 开源中国

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

    7 引用 • 86 回帖
  • 反馈

    Communication channel for makers and users.

    124 引用 • 907 回帖 • 210 关注
  • abitmean

    有点意思就行了

    29 关注
  • H2

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

    11 引用 • 54 回帖 • 649 关注
  • 脑图

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

    21 引用 • 58 回帖 • 1 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 19 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    9 引用 • 32 回帖 • 152 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 15 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 248 关注