go调试工具–delve
简介
go debug工具,专门为go开发的调试工具,并且采用go语言开发,支持多平台。
官网:https://github.com/go–delve/delve
快速开始
安装
go install github.com/go-delve/delve/cmd/dlv@latest
测试代码
package main
import (
"context"
"errors"
"fmt"
)
func main() {
fmt.Println("begin")
var (
a = []int{1,2,3,4,5}
b = []int{1,2,3,4,5}
ctx = context.Background()
)
res, err := doOperation(ctx, a, b)
if err != nil {
return
}
fmt.Printf("%vn",res)
fmt.Println("end")
}
func doOperation(ctx context.Context,a,b []int) ([]int,error) {
if len(a) == 0 && len(b) == 0{
return nil,errors.New("slice is empty")
}
if len(a) != len(b){
return nil,errors.New("slice length not equals")
}
res := make([]int, len(a))
for index := range a {
res[index] = a[index] + b[index]
}
return res,nil
}
dlv开始调试
dlv debug
断点
继续运行直到下一个断点
逐步运行
进入到调用函数(step in)
b main.go:17
在输入c
查看当前执行的代码
退出当前函数(step out)
现在运行到了doOperation
,想要返回到main 调用它的地方,输入so
打印变量
查看所有的本地变量
重新debug
使用介绍
上面的快速开始介绍了一些常用的使用方式,它的help写的很好,很清晰,关于单个命令就不再这里介绍了。
下面主要介绍几个命令
除此之外还有一个子命令(开始dlv session之后的输入的命令)
debug
dlv debug [package] [flags]
在没有参数的情况下,会自动编译当前文件夹下面的main包,也可以指定包的名字来debug
–headless :会开启一个服务端,用connect命令来连接及可进行debug,只要命令里面支持这个flag就可以用。
dlv debug --headless -l :2345 --log
dlv connect localhost:2345
exec
建议在build 二进制文件的时候要关闭掉编译器的优化,build的增加下面参数
-gcflags="all=-N -l"
test
package main
import (
"context"
"reflect"
"testing"
)
func Test_doOperation(t *testing.T) {
var ctx = context.Background()
t.Run("test1", func(t *testing.T) {
type args struct {
ctx context.Context
a []int
b []int
}
tests := []struct {
name string
args args
want []int
wantErr bool
}{
{
name: "test1",
args: args{
ctx: ctx,
a: []int{1,2,3,4},
b: []int{1,2,3,4},
},
want: []int{2,4,6,8},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := doOperation(tt.args.ctx, tt.args.a, tt.args.b)
if (err != nil) != tt.wantErr {
t.Errorf("doOperation() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("doOperation() got = %v, want %v", got, tt.want)
}
})
}
})
t.Run("test2", func(t *testing.T) {
type args struct {
ctx context.Context
a []int
b []int
}
tests := []struct {
name string
args args
want []int
wantErr bool
}{
{
name: "test1",
args: args{
ctx: ctx,
a: []int{1,2,3,4},
b: []int{1,2,3,4},
},
want: []int{2,4,6,8},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := doOperation(tt.args.ctx, tt.args.a, tt.args.b)
if (err != nil) != tt.wantErr {
t.Errorf("doOperation() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("doOperation() got = %v, want %v", got, tt.want)
}
})
}
})
}
dlv test [package] [flags]
-
dlv test -- --test.run Test_doOperation --test.v // 如果想要运行Test_doOperation中的test1,需要用/来拼接 dlv test -- --test.run Test_doOperation/test1 --test.v
dlv test -- --test.cd
goLand 远程debug
这就是把上面说的远程debug和goLand结合了起来。先说出核心操作是
命令行操作
go build
go build -o debug_main -gcflags "all=-N -l" base_go
dlv启动服务端
dlv exec ./debug_main --listen=:9987 --headless --api-version=2 --accept-multiclient --log
// 命令解释
// listen 指定host和port
// headless 启动无头浏览器
// api-version
// accept-multiclient
dlv启动客户端
dlv connect hadoop105:9987
正常操作
现在的背景是:服务端在Linux服务器中,客户端在windows中。
打断点
因为两个执行路径不一样,所以,打不开文件。但别的功能是可以用的,
goLang操作
搜索Go Remote,添加Host和Port,其实这里以及告诉我们服务端要怎么做了。
启动服务端
先在config里面选择刚才的remote,打断点,debug运行(先打断点,在启动debug)
到这里就结束了
原文地址:https://blog.csdn.net/daliucheng/article/details/131035411
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_29016.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!