如何使用VSCode远程调试Go代码

6
我在一个 Docker 容器中运行了一个需要调试的进程。该进程通过以下方式在 Docker 的入口点启动: dlv debug /go/src/path/to/package --headless --listen=:2345 --log,以便后续在 VSCode 中进行调试。
Docker 容器是通过以下命令启动的: docker run --rm -it -p 2345:2345 my_image:tag。请注意,delve 的端口已经暴露出来了。
在 VSCode 中,我按如下方式定义了 launch.json:
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Attach remote",
            "type": "go",
            "request": "attach",
            "mode": "remote",
            "port": 2345,
            "host": "127.0.0.1",
            "apiVersion": 1
        }
    ]
}

在启动“附加远程”VSCode调试配置时,我会得到enter image description here。虽然不是非常清晰,但这个UI让我相信我现在已经连接到远程无头调试器并准备好进行调试。我定义了一个断点,我知道通过发送给远程进程的请求将被命中。我发送了该请求,我得到了结果,但该断点从未被触发,表明我尚未实现远程调试。我的VSCode“附加远程”配置有问题吗?我可以使用dlv connect :2345进行命令行调试,并且实际上可以很好地调试远程进程,这表明无头服务器是正常的。但我更愿意在VSCode中使用源代码进行调试。
1个回答

1
请使用vscode-go最新测试版(2020年4月发布)再试一次(对于2020年4月之后的任何时间,最新的官方vscode-go版本都足够)。 Microsoft/vscode-go问题2010包括来自Ramya Rao的确认:

#3108的修复已经在此扩展的最新测试版中可用。请尝试并分享反馈
该扩展的最新版本已经解决了此问题。

而且:
我可以确认,现在我能够使用AWS SAM启动一个带有Delve和从Windows编译的Go二进制文件的Linux容器来打断点。对于仍然存在此问题的任何人(就像我在编辑此评论之前一样),请注意您的launch.json文件中的“remotePath”元素是本地系统上已编译源文件的绝对路径(而不是容器中的路径)。如上所示-它是在您编译二进制文件时添加到DWARF编译单元文件表中的绝对本地路径。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接