问题标签 [delve]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
debugging - Delve (dlv) 无法附加到进程
我从 dlv 收到此错误
二进制文件是这样构建的:
您能否确认这是-w
导致以下问题的标志?它会剥离调试符号吗?
google-app-engine - 将 go delve 与谷歌应用引擎标准和 dev_appserver.py 一起使用
在谷歌发行说明中它说:
我正在使用 dev_appserver.py 同时启动多个服务,以便它们都共享同一个数据存储模拟器,并且效果很好。
但是,当我添加 --go_debugging 标志时,我得到了很多我不明白的错误。如果有人有见识,我将不胜感激。
对于它尝试构建的每项服务,我都会遇到以下错误:
一次启动多个服务可能有问题吗?
谢谢!
go - 如何更新 Go 的 Delve 调试器?
如何更新他们的 Go Delve 调试器?我在尝试设置 api 版本时收到以下错误:
unknown flag: --api-version
我的dlv
外表过时了:
但我不知道如何升级它。我试过go get -u github.com/go-delve/delve/cmd/dlv
and go get -u github.com/derekparker/delve/cmd/dlv
,但都没有成功。我还尝试了以下建议make install
:
但这似乎没有效果:
我的 go 版本是go version go1.10.1 linux/amd64
,我的操作系统详细信息如下:
这是从我打开的问题中复制的。我想我会交叉发布以获得更大的知名度。
go - 如何使用 gdb 或 delve 为 go 方法设置断点
我想调试一个 go 代码。我想在导入包中的方法(属于命名类型)上放置断点。我浏览了很多在线资料,他们只在文件的行号上放置断点(例如:)breakpoint a.go:15
。
我在'C'中做了很多调试,我在函数上放置了断点。这种调试可以在go中进行吗?
我的主包中有以下代码。
clientContext := sdk.Context(fabsdk.WithUser("Admin"), fabsdk.WithOrg("ordererorg"))
.
我想设置断点
1)WithUser()
属于fabsdk
文件包的函数github.com/hyperledger/fabric-sdk-go/pkg/fabsdk/context.go
。
2)Context()
属于 type FabricSDK
in file github.com/hyperledger/fabric-sdk-go/pkg/fabsdk/fabsdk.go
in package的方法fabsdk
。
是否可以将断点设置为方法WithUser()
和context()
/或仅允许在文件中的行号处设置断点?我也可以使用 gdb 或 delve 或任何其他调试器。
docker - 使用 Delve GO 调试器传递二进制命令行参数
我在Docker 容器中运行了一个GO 二进制文件 。我有以下命令来执行二进制文件并传递命令行参数。app
-env-file=dev.env.list
CMD ["/dlv", "--listen=:3500", "--headless=true", "--api-version=2", "exec", "/app", "--", "-env-file=dev.env.list"]
我可以调试GO 二进制文件 app
,但无法获取命令行参数。Exec的文档没有提到命令行参数。
如何使用 Delve GO 调试器将命令行参数传递给二进制应用程序?
go - 由于同一包中未定义的对象,dlv 调试失败
我在delve 网站上为此提交了一个错误。所以,要解释发生了什么。我在同一个包中有 2 个文件,main.go 和 common.go。在 main.go 中,它使用 common.go 中的一些结构,当我运行时
dlv debug --listen=:2345 --headless --api-version=2 --log main.go
它因“未定义:NewSimpleStruct”而失败,我不确定我做错了什么。
这是 Go 文件包含的内容,
debugging - 从 Visual Studio 调试树莓派中的 golang 二进制文件
我正在使用 Windows 10 操作系统在树莓派(Raspbian GNU/Linux 9 拉伸)中从 Visual Studio 交叉编译以下示例代码:
为了从 VScode 在树莓派中运行它,我正在执行以下操作:
- 指定 env:GOARCH 和 env:GOOS
- 去构建 main.go
- 将生成的二进制文件复制到树莓派目录
- 登录 pi 并使二进制可执行文件
- 登录 pi 并运行二进制文件这运行良好,我得到了所需的打印语句。
我面临的问题是从 Visual Studio 调试树莓派中的代码。我可以通过安装 delve、转到 Windows 中的当前 go 目录并运行 dlv debug main.go 来调试 Visual Studio 中的代码。但是,我完全不知道如何在 Visual Studio 中设置断点,在树莓派中构建和调试代码?
我确实在网上查找了教程并尝试了一些,但是没有一个对我有用。任何帮助/链接/指导将不胜感激。
go - 断点命中后,Go Delve (1.0.0-rc2) 在 Windows 上冻结
我最近遇到了一个问题,这基本上使得使用 delve 调试 Go 几乎是不可能的。基本上我不能使用断点,否则调试的代码很有可能会冻结,我所能做的就是停止调试器重新启动。
从头开始......我在使用 GoLand IDE (2019.1) 和 delve (1.0.0-rc2) 调试 Go 时遇到了间歇性问题。整个会话将冻结 - 我知道什么都没有发生,因为调试的进程 CPU 使用率为零,并且没有消息写入日志的事实(我有很多 go-routines,其中大多数是偶尔写入日志消息) . 就好像断点被击中但调试器命令(STEP 等)未启用,这表明调试器不在断点处。发生这种情况时,我必须按两次GoLand STOP 按钮才能终止调试器,然后重新开始。
最近这个问题变得更加普遍。从每天几次到几乎每个调试会话。这很烦人,但至少它让我能够找到我认为的根本问题。似乎有时当遇到断点时,调试器会停止但 delve 或 IDE 没有意识到 - 所以没有办法继续。
我怎么知道这个?我通过在日志行(即 log.Printf)上设置断点向自己证明了这一点。当断点在那条线上时(我知道它会被命中),那么调试会话就会冻结。如果我确保没有将被击中的断点,那么程序运行得非常好,包括打印日志行。如果我在日志行之后的行上设置(一个且唯一的)断点,则会打印日志行并且会话冻结。
我认为这是 delve 的问题。请注意,我已经将同一个项目加载到 VSCode 中,并且发生了完全相同的事情(GoLand 和 VSCode 使用相同版本的 delve),所以我不认为 GoLand 做错了什么。但如果有人有另一种解释,我欢迎。
我已经尝试了很多事情来追查原因。我创建了一个小项目来演示这个问题,但它不会出现在一个简单的项目中。看来我做错了什么(在我的大型项目中)导致 delve 行为不端,但我不知道那是什么。
go - 如何构建 Kubernetes 以便调试信息包含在可执行文件中?
在尝试调试中的恐慌时kubelet
,我一直在尝试附加delve
到kubelet
可执行文件但未成功:
file
并objdump --syms
显示没有调试信息包含在kubelet
:
我在构建时尝试了不同的选择kubelet
:
或者:
但仍然没有调试信息包含在可执行文件中。在我看来,该-w
选项默认包含在 中go tool link
,它去除了 DWARF 符号表以节省最终的可执行文件大小(请参见此处)。但我无法扭转这一点。
关于我应该如何构建kubelet
以包含调试信息的任何想法?
docker - vscode(Win 10)中的断点“未经验证”并且在 Linux Docker 容器(Hyper-V)中远程调试 Go 应用程序时未命中
我正在为 Windows 10 使用 vscode(1.34.0 内部和稳定版本)开发 Go (1.12.0) api-server。源代码位于 Windows 机器上定义的 %GOPATH% 中。Delve (dlv.exe - 1.2.0 版) 也安装在 %GOPATH%\bin 中,%GOPATH%\bin 也安装在 Windows %PATH% 中。
然后使用 docker-compose 在 Docker(Docker 桌面版本 2.0.0.3 (31259))容器中构建 go 应用程序(因为数据库和 Web 服务器等其他一些服务正在其他容器中运行)。然后将最终的 go 应用程序二进制文件与 delve 可执行文件一起复制到 Alpine-Linux 容器中,并以无头模式启动 delve 服务器。没有源代码被复制到 Alpine-Linux 容器中,只有二进制文件。
使用此设置,我无法在 vscode 中正确设置远程调试。调试器确实启动了我的应用程序,但任何断点都会立即变为灰色并变为“未验证”。当应用程序(api 服务器)运行时,它们也不会受到影响。
使用 Jetbrains 的 Goland IDE 进行远程调试时,使用此设置进行调试非常有效(调试器启动,可以设置断点并命中)。
在过去的几天里,我试图找到一个解决方案,在论坛上找到与 Chrome 调试、Node.js 调试等类似问题的论坛帖子,以及 Go 上的这篇帖子,特别是:
我还找到了这个示例配置:
https://github.com/lukehoban/webapp-go/blob/debugging/.vscode/launch.json
我认为我遇到的主要问题是,我在任何地方都找不到任何示例,说明如何在 launch.json 中为 Windows 机器上的远程调试配置正确设置程序的路径(我也找不到任何与此相关的文档)。源代码仅在 GOPATH 中的 Windows 机器上,而不是在应用程序和 delve 运行的最终容器中(这同样适用于 Goland 调试器)
我的项目路径/目录结构(简化):
我当前的 launch.json 配置(请参阅下面我尝试的一些变体)
launch.json - 远程配置
注意:project_folder/cmd/my_api 是 api 服务器的 main.go 所在的位置。但是,此应用程序的某些包直接位于项目文件夹下,即 project_folder/package1/package1.go
我试过了
和
和
和
和
我也试图改变这一点(没有明显的变化):
没有成功。
我用于构建应用程序并以无头模式启动 delve 的多阶段 Dockerfile:
我在其中一个包中设置了一个断点(不是在 project_dir/cmd/my_api/main.go 中,而是在 project_dir/package1/package1.go 中)。一旦我在 vscode 中启动调试器并且没有命中断点,它就会变成灰色并且“未经验证”。
我可能在一个非常简单的层面上做错了什么,但我似乎无法弄清楚是什么。
更新 我终于找到了调试器日志并看到了这个:
我不确定它是否能帮助我真正找出 vscode 的问题。这可能是一个错误吗?我找到了对旧 MacOS 错误的引用:
https://github.com/Microsoft/vscode-go/issues/1859
和
https://github.com/go-delve/delve/issues/1282
但这些都是旧的和固定的(?)。
除了windows路径分隔符(“\”)被vscode(?)转换为Unix风格的路径分隔符“/”外,路径正确,文件存在,设置断点的行在中间文件的(和正确的)...
在 vscode 中,如果我按住 CTRL 键单击“找不到..”中显示的路径(由 vscode 制成链接),它会将我直接带到文件(因此 vscode 可以找到/看到它没有问题)。
这在 Windows 主机上连接没有问题(但仅在从该目录中调用时):
和
找到这个函数,所以(源)代码似乎是可见的。
直接在 Delve 中设置我想要的断点也可以:
Windows 样式的路径在命令行上也以相同的方式工作:
这是 vscode 中的 Windows/Unix 路径样式问题吗?有什么建议么?
更新 2 刚发现这个 2018 年末的错误报告,它似乎描述了 Delve 和 vscode 之间的类似问题:
https://github.com/bazelbuild/rules_go/issues/1844
但是,正如我在上面发布的那样,在我的情况下,Delve 似乎没有问题通过断点的绝对(Windows)路径,所以我不确定上述错误是否适用于这种情况?另外,为什么它会直接在 Delve 中工作,而不是通过 vscode?还是毕竟是 Windows 路径/Unix 路径问题?
感谢您的任何帮助!