使用 Delve 调试远程 Go 应用

2023-10-10 01:20

本文主要是介绍使用 Delve 调试远程 Go 应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Delve 是 Go 语言的一个调试器。其目标是为 Go 语言提供一个易用,拥有完整功能的调试工具。

安装可以参考这里。

dlv version 命令验证是否安装成功:

$ dlv version
Delve Debugger
Version: 1.7.1
Build: $Id: 3bde2354aafb5a4043fd59838842c4cd4a8b6f0b $

构建应用

在实际项目中 Delve 可以方便我们在本地调试部署在远程的 Go 应用,但为了使 Delve 的调试器正常工作,一些信息必须在构建过程中避免被编译器或链接器优化。这通过给 go build 添加参数来实现。

构建应用时禁用编译器优化

为了保证进行 debug 时实际运行的代码与源代码相同,需要使用下面的命令构建应用以禁止编译器在编译时对代码进行优化。

go build -gcflags="all=-N -l" -o bin/app

go build 可以用 -gcflags 给 go 编译器传入参数,也就是传给 go tool compile 的参数,因此可以用 go tool compile --help 查看所有可用的参数。"all=-N -l" 表示对所有包的编译应用 -N 和 -l。

执行 go tool compile --help 可以看到 -N 和 -l 的作用:

-N disable optimizations # 禁用优化
-l disable inlining # 禁用内联优化

使用 -m 可以查看编译器优化决策。

Delve 并不强制禁用编译器优化,但这可能会导致实际运行代码与源代码不匹配的情况,那这部分不匹配的代码(如被内联优化的代码)就没法对其进行 debug。而生产环境对性能是敏感的,优化策略不应该被轻易放弃。

确保链接器生成 DWARF 信息

另外,在构建 release 包时我们通常会加上 ldflags 参数:-ldflags '-w -s'。ldflags 给链接器传递参数,-w 将可执行文件体积缩小近 20 %。

go tool link --help 查看 -w 和 -s 作用。

-s disable symbol table # 不使用符号表
-w disable DWARF generation # 不生成 DWARF 信息

需要注意的是,Delve 依赖于 DWARF 信息,因此如果想用 Delve 进行调试,就不能使用 -w 参数。

用 Delve 调试应用

Delve 提供了丰富的本地应用调试能力,此外,Delve 还允许我们从远程连接到其调试器,提供了在本地调试远程应用的能力。

直接运行应用

Delve 有两种方式直接运行应用。一种为在应用根目录(main.go 同级)下直接以 debug 模式启动应用,启动后会进入 Delve 的交互模式。

$ dlv debug
Type 'help' for list of commands.
(dlv) threads
* Thread 457777 at :0
(dlv) 

输入 help 查看所有可用命令,输入 quit 退出并终止程序。

另一种为运行可执行文件:

$ go build -o demo
$ dlv exec demo
Type 'help' for list of commands.
(dlv) threads
* Thread 459012 at :0
(dlv) 

附着到正在运行的 Go 进程上

构建并启动 web 服务。

$ go build
$  ./demo
2021/09/06 15:26:23 read config from: config.yaml
2021/09/06 15:26:23 start server and listen:  127.0.0.1:8081

dlv 附着到 PID 为 17062 的 demo 应用上。

$ psPID TTY           TIME CMD
17062 ttys000    0:00.02 ./thewaytowire
$ dlv attach 17062
Type 'help' for list of commands.
(dlv)

将 Delve 调试器暴露,允许远程连接调试

上述方式都是在本地进行调试,其基本逻辑都是先启动应用,然后启动 Delve 的调试器,然后让调试器 attach 到应用进程上。

为了能够从远程操控 Delve 的调试器,需要将调试器暴露到网络中,指定远程连接的端口,从远程连接到调试器使用的 api 版本,以及其它参数。上述的三种方式:debug, exec, attach 都支持从远程操控,只需为 dlv 命令加上下述参数:

--listen=:2345 --headless=true --api-version=2 --accept-multiclient

最后一步,本地连接运行在远程的 Delve 调试器

Delve 支持多个编辑器,可以参考 这里。

下面为 GoLand 的使用方式。

创建配置。
在这里插入图片描述

连接调试器。
在这里插入图片描述

这篇关于使用 Delve 调试远程 Go 应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/176913

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

go中的时间处理过程

《go中的时间处理过程》:本文主要介绍go中的时间处理过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 获取当前时间2 获取当前时间戳3 获取当前时间的字符串格式4 相互转化4.1 时间戳转时间字符串 (int64 > string)4.2 时间字符串转时间

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客