Versions Compared
compared with
Key
- This line was added.
- This line was removed.
- Formatting was changed.
当我们需要特定的运行环境才能复现某些疑难问题,通过goland
的remote debug
功能可以实现很方便的远程调试,快速定位问题。我这里以远程调试Kubernetes
集群中的golang
程序为示例演示如何使用goland
的remote debug
功能。
安装dlv工具
是的,你没猜错,这个玩意是拿来远程交互debug
工作的:https://github.com/go-delve/delve
通过手动编译安装,命令如下,注意这和官方提供的命令有出入,以我的为准:
Code Block | ||
---|---|---|
| ||
git clone https://github.com/go-delve/delve
cd delve/cmd/dlv
CGO_ENABLED=0 go build -o dlv main.go
# 拷贝工具到容器
kubectl cp ./dlv khaos/khaos-guardian-x7j9t:/app/ -c metrics-agent |
重新编译程序
需要添加-gcflags
参数,给编译器传递-N -l
参数,禁止编译器优化和内联:
Code Block | ||
---|---|---|
| ||
CGO_ENABLED=0 go build -gcflags "all=-N -l" main.go
# 拷贝程序到容器
kubectl cp ./main khaos/khaos-guardian-x7j9t:/app/ -c metrics-agent |
进容器执行程序
使用dlv
工具执行程序的语法如下:
Code Block | ||
---|---|---|
| ||
dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec ./demo |
如果程序需要运行参数,那么需要加上--
,例如:
Code Block | ||
---|---|---|
| ||
dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec ./demo -- --c=/config
# 等同于
./demo --c=/config |
因此我的程序的执行命令如下:
Code Block | ||
---|---|---|
| ||
./dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec ./main -- --debug=true --address=:13047 --nodeIP=21.0.44.12 --rootPath=/khaos/root --agentConfigFilePath=/var/run/khaos-guardian/metricsconfig/config.yaml --kubeStateUrl=http://127.0.0.1:13043/metrics --enabledPlugins=.+ |
执行反向代理到dlv
使用kubectl
的port-forward
命令:
Code Block | ||
---|---|---|
| ||
kubectl -n khaos port-forward pod/khaos-guardian-8p2gx 2345:2345 --address 0.0.0.0 |
开启goland remote debug
增加Go Remote
配置即可。可以看到,这里的IDE
也有提示如何开启远程调试的步骤。
Image Added通过goland的remote debug功能可以实现很方便的远程调试
Panel | ||||
---|---|---|---|---|
| ||||
|