Goland配置debug

打开Goland,点击Run,再点击Edit configurations,配置debug

配置说明:

Run kind

指定了运行的类型或模式,可选以文件/包/目录的方式运行
File:以单个文件的方式运行。这种方式适用于直接运行单个 Go 文件,不需要编译整个包。
Package:以包的方式运行。这种方式需要指定一个包路径,适用于运行包含 main 函数的包,编译并运行整个包。
Directory:以目录的方式运行。这种方式适用于运行整个目录下的所有 Go 文件,通常用于运行包含多个包的项目。

Package path

BeegoBlog/AllSrcCode 指定要运行或调试的 Go 包的路径。

Output directory
可以留空,或者指定编译后的可执行文件的一个输出目录。

Run after build
勾选此选项。编译成功后自动运行生成的可执行文件,并将程序的输出显示在运行窗口中。

Working directory

确保设置为项目的工作目录,例如 /Users/minzhangli/gopath/src/BeegoBlog。

Environment
用于设置环境变量。环境变量是在操作系统中定义的变量,它们可以影响程序的运行行为。在 GoLand 中设置环境变量可以让你的程序在不同的环境下运行时具有不同的配置。
用途:可以在这里添加、修改或删除环境变量,这些变量将在程序运行时被使用。例如,可以设置 DEBUG=1 来启用程序的调试模式,或者设置 PORT=8080 来指定服务器监听的端口。
格式:环境变量通常以 KEY=VALUE 的形式设置。

Go tool arguments
可以留空,用于向 Go 工具(如 go build、go run 等)传递额外的命令行参数。
用途:这允许你自定义 Go 工具的行为,例如指定编译选项、设置编译目标等。例如,你可以添加 -race 来启用数据竞争检测,或者使用 -tags=ssl 来编译时包含特定的构建标签。
格式:这些参数直接作为命令行参数传递给 Go 工具

Program arguments:
可以留空,用于向你的 Go 程序传递命令行参数。用途:这允许你在运行程序时传递参数,这些参数可以在程序内部被解析和使用。
例如,你可以传递 --config=production 来指定程序运行的配置模式,或者使用 --log-level=debug 来设置日志级别。
格式:这些参数将被传递给你的 Go 程序,通常在 main 函数中通过 os.Args 切片来访问。

根目录是否配置错误?

可以在main包检测一下,当前文件位置所在位置,对比参数的根目录就知道。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//获取配置文件
err := beego.LoadAppConfig("ini", "conf/app.conf")
// 是否找不到配置文件
if err != nil {
fmt.Println("获取配置文件报错:",err)
dir, err1 := os.Getwd()//获取当前文件所在位置
if err1 != nil {
fmt.Println("方法报错了:", err1)
return
}
fmt.Println("当前文件所在位置:",dir)
}

//打印加载的配置项(用于调试)
fmt.Println("RunMode:", beego.AppConfig.String("runmode"))
fmt.Println("HttpPort:", beego.AppConfig.String("httpport"))
fmt.Println("MysqlHost:", beego.AppConfig.String("mysqlHost"))
fmt.Println("MysqlPort:", beego.AppConfig.String("mysqlPort"))
fmt.Println("MysqlUser:", beego.AppConfig.String("mysqlUser"))
fmt.Println("MysqlPassword:", beego.AppConfig.String("mysqlPassword"))
fmt.Println("MysqlDb:", beego.AppConfig.String("mysqlDb"))
//beego.BConfig.RunMode = "dev"

通过这个检测,可以对比出Working directory参数配置是否错误。终端输出,
mysq连接正常-redis连接正常-日志log正常启动。页面正常打开登录,功能正常。

delve安装配置

Goland中进行调试时,Delve是推荐的调试工具,因为它能够很好地支持Golang语言的特性,如goroutine、channel等。Delve是Go社区官方支持的调试器,因此通常建议使用Delve来实现断点调试。Goland与Delve的集成度很高,能够方便地设置断点、查看变量、单步执行等操作。

goland开启debug,打断点时,断点显示无效,报:protocol error E09 during set breakpoint for packet $Z0,1d7beda,1

1.安装Delve

需要匹配goland版本

1
>go version //go1.22.11

Go版本是1.16或更高:

1
>go install github.com/go-delve/delve/cmd/dlv@latest

Go版本低于1.16:

1
2
3
>git clone https://github.com/go-delve/delve
>cd delve
>go install github.com/go-delve/delve/cmd/dlv

对于Go 1.15,可以安装Delve 1.4.0版本(安装特定版本的Delve)

1
>go install github.com/go-delve/delve/cmd/dlv@v1.4.0

验证安装:

1
>dlv version

2.Goland中配置Delve

默认配置:Goland默认使用Delve作为调试器,通常无需额外配置。
自定义Delve路径:

1
>which dlv

如果需要指定Delve的路径,可以在Goland中打开Help->Edit Custom Properties对话框,添加以下配置:
dlv.path=/path/to/dlv
确保路径与实际安装的Delve可执行文件位置一致。

3.关闭编译器优化和内联

在调试时,为了确保调试信息的完整性,需要关闭编译器优化和内联。对于Go 1.10及更高版本,编译时添加以下参数:

1
>go build -gcflags="all=-N -l"//让调试信息更为完整

-N:禁用优化。优化会改变代码的执行路径和变量的存储方式,使得调试变得困难,但它可以让代码的执行路径与源代码保持一致,方便调试。
-l:禁用内联,内联会将小函数的代码直接插入到调用点,这会改变函数调用的结构。但它可以确保函数调用的结构清晰,便于查看调用栈。

优化和内联通常会提高程序的性能,但会使得调试变得困难,因为代码的执行路径和变量的存储方式会被改变,生成的可执行文件会包含调试信息。

bee run会重新编译项目,会覆盖掉之前用-gcflags编译的可执行文件,而不是使用之前编译的可执行文件,不会受到影响。若再debug调试,需要重新关闭编译器优化和内联。如果在调试配置中设置了-gcflags=“all=-N -l”,则无需每次手动执行go build(Run > Edit Configurations->Go tool arguments,添加-gcflags=“all=-N -l”)。
gc在Go中有两个含义,一个是Go编译器(gc),另一个是垃圾回收(Garbage Collection)。gcflags是用于自定义Go编译器的行为。不执行这一步,会影响断点的正确命中、变量的准确性、调用栈分析困难、调试信息不完整。