使用 neovim 远程调试 k8s 容器内的 golang 应用
概述
云原生时代,大量应用使用容器化部署在 k8s 内,且使用 golang 编程语言开发的应用越来越多。在开发过程中,如何调试容器内的 golang 应用呢?本文将介绍如何使用 neovim 远程调试 k8s 容器内的 golang 应用。
什么情况下需要远程调试?
复现一些 bug 需要一定的复现条件,且应用之间还有依赖,不方便直接在本地调试,此时最好的方式是直接调试 k8s 容器里正在运行中的 go 进程。
neovim 依赖插件
确保 nvim-dap 插件安装好。
由于远程调试不需要在本地启动 dap server 来调试,所以不需要安装 nvim-dap-go。
neovim 配置
local dap = require("dap")
dap.adapters.dapserver = {
type = "server",
host = "127.0.0.1",
port = 40000,
}
local resolved_path = vim.fn.getcwd() .. "/debug-roc/launch.json"
if not vim.loop.fs_stat(resolved_path) then
return
end
require("dap.ext.vscode").load_launchjs(resolved_path, { server = { "go" } })
以上配置仅供参考,可根据实际需求进行修改,相关解释:
- 加载并解析 vscode 格式的
launch.json
文件来配置项目的调试信息,配置文件默认路径是项目下的.vscode/launch.json
,我这里改成了debug-roc/launch.json
路径。 nvim-dap
插件作为 dap client,需要连接 dap server 进行调试,我这里固定将 server 地址设置为127.0.0.1:40000
。load_launchjs
传入的 server 列表是哪些文件类型需要解析launch.json
配置(执行:DapContinue
命令弹出的调试选项列表将包含解析到的调试配置)。
编译 delve
调试 go 应用需要使用 delve ,这里我们需要编译一个 dlv 二进制,用于在容器内启动调试服务。
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags '-extldflags "-static"'
这里使用的是静态编译,确保编译出来的二进制不依赖于容器内的动态库 ,避免因环境依赖问题导致 dlv 无法启动。
然后将编译出来的 dlv 二进制拷贝到正在运行的容器内:
kubectl cp -c <CONTAINER> ./dlv <POD>:/dlv