调试 go 应用程序不会在断点处停止
debugging go application doesn't stop at breakpoints
我有最新的 IntelliJ Ultimate EAP 和最新的 Gogland,在 MacOS Sierra 下都出现了问题。
我正在尝试通过为 Go Application
创建调试配置文件来调试 go 应用程序,并且 Run Kind
配置为 Package
,其中包含当前项目的包名称.
在Go tool arguments
下我配置了-ldflags="-linkmode internal"
。
当我在有一些断点的情况下启动调试会话时,它会 运行 但不会在这些断点处停止。
我错过了什么?
谢谢
更新
好的,我能够通过以下项目重现该问题:
test1.go
包含:
package main
const Numb uint64 = 5
test2.go
包含:
package main
import "fmt"
func main() {
fmt.Println(Numb);
}
我使用以下参数创建了一个 Go Application
run/debug 配置:
Run kind: package
Package: github.com/kfirufk/test
Working Directory: /usr/local/Cellar/go/1.8.1/src/github.com/kfirufk/test/
当我在 test2.go
第 6 行(主函数中的第一行也是唯一一行代码)上选择断点并启动调试会话时,我看到以下输出:
"/Users/ufk/Library/Application Support/IntelliJIdea2017.1/Go/lib/dlv/mac/dlv" --listen=localhost:53111 --headless=true exec /private/var/folders/cn/n7rwdd_95_l54s3zdnbxvw040000gn/T/Unnamedgo --
GOROOT=/usr/local/Cellar/go/1.8.1/libexec
GOPATH=/usr/local/opt/go
/usr/local/Cellar/go/1.8.1/libexec/bin/go build -o /private/var/folders/cn/n7rwdd_95_l54s3zdnbxvw040000gn/T/Unnamedgo -gcflags "-N -l" github.com/kfirufk/test
API server listening at: 127.0.0.1:53111
5
我正确地得到了程序的输出,但 Intellij 没有在所需的断点处停止。
问题在 MacOS Sierra 10.12.4 上使用 Go Lang 插件 0.171.1928 的 Intellij 2017.1.3 上重现。
更新
尝试使用 intellij 的 delve 来更好地理解正在发生的事情:
/Users/ufk/Library/Application\ Support/IntelliJIdea2017.1/intellij-go/lib/dlv/mac/dlv exec ./test
然后我执行了:
(dlv) step
并收到:
Command failed: could not find FDE for PC 0x78bc000
我是不是不明白如何使用 Delve,或者这里有什么地方不能正常工作?
更新
是的.. 使用 continue
调试器可以在两个版本的 delve 上正常工作(从 homebrew 和 intellij 的版本安装)。但 intellij 的工作原理是一样的,不会在断点处停止。当我打印变量时,我在 test2.go
处创建了一个断点。
有什么想法吗?
好的..我终于明白了。我弄混了 GOROOT 结构和 GOPATH 结构,我把我的项目放在 GOROOT 而不是 GOPATH 中。
这就是我解决问题的方法
我完全删除了 go with brew uninstall --force go
,然后重新安装了 go with 以下环境变量:
export GOPATH=$HOME/golang
export GOROOT=/usr/local/opt/go/libexec
export PATH=$PATH:$GOPATH/bin
export PATH=$PATH:$GOROOT/bin
然后我把我的项目放在~/golang/src/github.com/kfirufk/windy-server
我终于能够正确调试 go 应用程序了。
谢谢大家对我的帮助! :)
对我来说,问题解决了添加:
export GOROOT="/usr/local/go"
到 $HOME/.profile.
编辑:
我正在使用 LiteIde X35.2 和 Delve Debugger
版本:1.1.0
构建:$Id:1990ba12450cab9425a2ae62e6ab988725023d5c $
下:
DISTRIB=LinuxMint VERSION=18.3 CODENAME=sylvia
RELEASE=#41~16.04.1-Ubuntu SMP Wed Oct 10 20:16:04 UTC 2018
UBUNTU_CODENAME=xenial KERNEL=4.15.0-38-generic HDWPLATFORM=x86_64
DESKTOP_SESSION=XFCE WINDOWS_MANAGER=XFWM4
DESKTOP_COMPONENTS=kdevtmpfs gnome-keyring-d xfce4-session xfce4-panel
xfce4-volumed polkit-gnome-au xfce4-power-man xfce4-terminal
gnome-pty-helpe
GTK=libgtk-3-0:amd64 3.18.9-1ubuntu3.3 GStreamer=gst-launch-1.0
version 1.8.3 GStreamer 1.8.3
https://launchpad.net/distros/ubuntu/+source/gstreamer1.0
在我的例子中,该进程已经 运行 在那个端口上并且没有关闭。所以我不得不手动停止进程并再次从 IntelliJ 运行。
对于我的情况(VSCode on Ubuntu 20.04),如果项目在符号 link 目录(或符号目录的子目录)中,vscode 将显示 "unverified" 个断点和
"Error on CreateBreakpoint: could not find file ..."
这导致在断点处不停止。
cd \`readlink -f <project dir>\` && code .
会好的。
就我而言 (GoLand),问题在于我的调试配置中未设置标志 -trimpath
:
- "运行", "调试...", "编辑配置"。
- 在模板项中,转到“Go Test”选项并在“Go tool arguments”中添加参数
-trimpath
您还可以在您的环境中设置:
go env -w GOFLAGS="-trimpath"
这也适用于“附加到进程”调试选项。
您可以在菜单“帮助”、“显示日志文件”中看到GoLand IDE 日志。它会让你的生活更轻松。
我有最新的 IntelliJ Ultimate EAP 和最新的 Gogland,在 MacOS Sierra 下都出现了问题。
我正在尝试通过为 Go Application
创建调试配置文件来调试 go 应用程序,并且 Run Kind
配置为 Package
,其中包含当前项目的包名称.
在Go tool arguments
下我配置了-ldflags="-linkmode internal"
。
当我在有一些断点的情况下启动调试会话时,它会 运行 但不会在这些断点处停止。
我错过了什么?
谢谢
更新
好的,我能够通过以下项目重现该问题:
test1.go
包含:
package main
const Numb uint64 = 5
test2.go
包含:
package main
import "fmt"
func main() {
fmt.Println(Numb);
}
我使用以下参数创建了一个 Go Application
run/debug 配置:
Run kind: package
Package: github.com/kfirufk/test
Working Directory: /usr/local/Cellar/go/1.8.1/src/github.com/kfirufk/test/
当我在 test2.go
第 6 行(主函数中的第一行也是唯一一行代码)上选择断点并启动调试会话时,我看到以下输出:
"/Users/ufk/Library/Application Support/IntelliJIdea2017.1/Go/lib/dlv/mac/dlv" --listen=localhost:53111 --headless=true exec /private/var/folders/cn/n7rwdd_95_l54s3zdnbxvw040000gn/T/Unnamedgo --
GOROOT=/usr/local/Cellar/go/1.8.1/libexec
GOPATH=/usr/local/opt/go
/usr/local/Cellar/go/1.8.1/libexec/bin/go build -o /private/var/folders/cn/n7rwdd_95_l54s3zdnbxvw040000gn/T/Unnamedgo -gcflags "-N -l" github.com/kfirufk/test
API server listening at: 127.0.0.1:53111
5
我正确地得到了程序的输出,但 Intellij 没有在所需的断点处停止。
问题在 MacOS Sierra 10.12.4 上使用 Go Lang 插件 0.171.1928 的 Intellij 2017.1.3 上重现。
更新
尝试使用 intellij 的 delve 来更好地理解正在发生的事情:
/Users/ufk/Library/Application\ Support/IntelliJIdea2017.1/intellij-go/lib/dlv/mac/dlv exec ./test
然后我执行了:
(dlv) step
并收到:
Command failed: could not find FDE for PC 0x78bc000
我是不是不明白如何使用 Delve,或者这里有什么地方不能正常工作?
更新
是的.. 使用 continue
调试器可以在两个版本的 delve 上正常工作(从 homebrew 和 intellij 的版本安装)。但 intellij 的工作原理是一样的,不会在断点处停止。当我打印变量时,我在 test2.go
处创建了一个断点。
有什么想法吗?
好的..我终于明白了。我弄混了 GOROOT 结构和 GOPATH 结构,我把我的项目放在 GOROOT 而不是 GOPATH 中。
这就是我解决问题的方法
我完全删除了 go with brew uninstall --force go
,然后重新安装了 go with 以下环境变量:
export GOPATH=$HOME/golang
export GOROOT=/usr/local/opt/go/libexec
export PATH=$PATH:$GOPATH/bin
export PATH=$PATH:$GOROOT/bin
然后我把我的项目放在~/golang/src/github.com/kfirufk/windy-server
我终于能够正确调试 go 应用程序了。
谢谢大家对我的帮助! :)
对我来说,问题解决了添加:
export GOROOT="/usr/local/go"
到 $HOME/.profile.
编辑: 我正在使用 LiteIde X35.2 和 Delve Debugger 版本:1.1.0 构建:$Id:1990ba12450cab9425a2ae62e6ab988725023d5c $
下:
DISTRIB=LinuxMint VERSION=18.3 CODENAME=sylvia
RELEASE=#41~16.04.1-Ubuntu SMP Wed Oct 10 20:16:04 UTC 2018 UBUNTU_CODENAME=xenial KERNEL=4.15.0-38-generic HDWPLATFORM=x86_64
DESKTOP_SESSION=XFCE WINDOWS_MANAGER=XFWM4 DESKTOP_COMPONENTS=kdevtmpfs gnome-keyring-d xfce4-session xfce4-panel xfce4-volumed polkit-gnome-au xfce4-power-man xfce4-terminal gnome-pty-helpe
GTK=libgtk-3-0:amd64 3.18.9-1ubuntu3.3 GStreamer=gst-launch-1.0 version 1.8.3 GStreamer 1.8.3 https://launchpad.net/distros/ubuntu/+source/gstreamer1.0
在我的例子中,该进程已经 运行 在那个端口上并且没有关闭。所以我不得不手动停止进程并再次从 IntelliJ 运行。
对于我的情况(VSCode on Ubuntu 20.04),如果项目在符号 link 目录(或符号目录的子目录)中,vscode 将显示 "unverified" 个断点和
"Error on CreateBreakpoint: could not find file ..."
这导致在断点处不停止。
cd \`readlink -f <project dir>\` && code .
会好的。
就我而言 (GoLand),问题在于我的调试配置中未设置标志 -trimpath
:
- "运行", "调试...", "编辑配置"。
- 在模板项中,转到“Go Test”选项并在“Go tool arguments”中添加参数
-trimpath
您还可以在您的环境中设置:
go env -w GOFLAGS="-trimpath"
这也适用于“附加到进程”调试选项。
您可以在菜单“帮助”、“显示日志文件”中看到GoLand IDE 日志。它会让你的生活更轻松。