Go项目如何远程调试

原创 吴就业 122 0 2022-02-20

本文为博主原创文章,未经博主允许不得转载。

本文链接:https://wujiuye.com/article/346f228c8e924805ba49c9ec94e0935b

作者:吴就业
链接:https://wujiuye.com/article/346f228c8e924805ba49c9ec94e0935b
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。

本篇文章写于2022年02月20日,从公众号|掘金|CSDN手工同步过来(博客搬家),本篇为原创文章。

远程debug也是排查线上故障的有效手段。

容器下受权限限制,需要以root启动进程,并且获得特权模式才可使用。

前提条件

在编译go项目时,使用go build -gcflags "all=-N -l",关闭内联优化,以支持debug。

关于-gcflags "-N -l"参数的解释: > 编译时,如果编译的结果需要gdb调试则使用参数-gcflags "-N -l",这样可以忽略Go内部做的一些优化,聚合变量和函数等优化。

服务器环境准备

1、go安装

wget https://go.dev/dl/go1.17.6.linux-amd64.tar.gz (选择版本下载)
tar -zxvf go1.17.6.linux-amd64.tar.gz

2、生成临时环境变量

export GOPATH=/tmp/goprojects
export GOROOT=~/go
export PATH="$PATH:$GOROOT/bin"

3、下载安装git

root权限下可yum install git安装成功后再切换登录用户.

4、安装delve工具

git clone https://github.com/derekparker/delve.git
cd delve/cmd/dlv/
go build
go install

可执行文件在$GOPATH/bin路径下,如/tmp/goprojects/bin

5、服务端启动监听服务

$GOPATH/bin/dlv attach 进程id --headless --api-version=2 --log --listen=:2345,如:

./bin/dlv attach 4056 --headless --api-version=2 --log --listen=:2345

如果提示没有权限,切换到root用户执行。

GoLand配置

不需要配置什么FSTP,上传代码,仅需要按下图配置一个Go Remote即可。

go远程调试-goland配置.png

#后端

声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。

文章推荐

go依赖的module的版本号必须是"vx.x.x"的格式

报错:no matching versions for query "v1.0"。依赖的module的版本号必须是"vx.x.x"的格式,其中'x.x.x'中的'x'是数字。

jeprof命令报错:The first profile should be a remote form to use /pprof/symbol

jeprof命令报错:`The first profile should be a remote form to use /pprof/symbol`,这是因为命令需要程序源文件(原二进制文件)。另外`FATAL ERROR: Did not specify profile file`错误也是一样的问题。

k8s容器线上排查进程突然挂掉原因

对于线上应用,出现进程自动挂掉的原因,如果可以排除因程序本身原因,那么很大可能性是因为操作系统内存不够用,进程被操作系统kill掉了。

Java中的中断机制

中断,其实只是jvm用于唤醒因锁竞争、I/O操作、休眠等待被挂起的线程,并设置一个中断标志,我们可以利用这个标志去做一些处理。

https证书如何验证是否生效

在做接入器中间件需求时,接入器需要支持cdn通过https协议回源,测试怎么验证证书有没有生效呢?

新项目从零到一DDD实战思考与总结

本篇笔者以近期的一个项目实战跟大家分享笔者目前对DDD的理解,以及在实战DDD过程中遇到的问题思考与总结,仅个人经验,偏战术设计。