vscode 中的调试不会在断点处停止,调试器启动时显示“无法找到文件...”

Dav*_*arr 5 go delve vscode-debugger

乌班图。vscode 1.62.1。去1.17.3。vscode go 扩展 v0.29.0。深入研究 v1.7.1。

我是 vscode 和 Go 的新手。我有多年在 Eclipse 中调试 Java 应用程序的经验。

我构建了一个小型多模块 Go 应用程序。我可以在其他模块的 main 和其他函数中设置断点。在 main.go 中,我选择“开始调试”。

它启动应用程序,我可以从控制台得知它正在工作,并且 REST 端点以我的虚拟响应进行响应。

但是,它不会在断点处停止。当我开始会话时,红色断点标记突然变得空心,并且将鼠标悬停在其中一个断点标记上会显示一条消息“无法找到文件...”,该消息会打印相关源文件的完整路径。

当我启动它时,它在控制台中显示以下内容:

开始: /home/.../go/bin/dlv-dap dap --check-go-version=false --listen=127.0.0.1:43347 --log-dest=3 来自 /home/.../ ... DAP 服务器监听:127.0.0.1:43347

我还没有修改 launch.json (我希望有一天能够提供一个更友好的界面来编辑启动配置)。

我还能做错什么吗?

更新

这是在我按 F5(开始调试)之前显示 main.go 的屏幕截图:

按 F5 之前

请注意,我在 main 的第一行 print 语句上有一个断点。

这是我按 F5 后看到的:

按F5后

请注意,它在控制台中打印了“At start of main”。它并没有停在断点处。另请注意将鼠标悬停在断点上时工具提示中的消息。

更新

这是我的目录结构的视图:

项目目录结构

Von*_*onC 2

首先,只需确保您已使用go mod init voltagems: 启动了项目,这将解释import "voltagems/xxx",但也有助于在调试时深入查找文件。 你旁边应该有和文件main.go
go.modgo.summain.go文件。

其次,检查您的go env输出,确保GOPATHGOROOT已设置为默认路径。

OP David M. Karr在评论中补充道:

go mod init我第一次创建项目时确实运行了“ ”,但我意识到我不喜欢根模块名称,所以我将其更改为“ voltagems

我相信你可以直接编辑 go.mod 第一行,并确保它显示:

module voltagems
Run Code Online (Sandbox Code Playgroud)

然后go mod verify+go mod tidy

最后,go build .。重新启动 VSCode(或命令Reload Window),然后查看问题是否仍然存在。


OP David M. Karr指出了根本原因:

我的项目路径中有符号链接。

VSCode-Go 中有一个“ substitutePath”配置用于映射到绝对路径。

您可以在使用旧版调试适配器进行调试中看到该参数

substitutePath

用于从编辑器中的路径获取到已编译程序中的路径的路径映射(默认值:[])。

这来自问题 622debug:使用符号链接时断点不起作用”。
提交 93f32bb

src/debugAdapter: 添加substitutePath调试配置

此更改为启动和附加请求添加了新的配置选项。
substituePath接受一个从字符串映射到字符串的数组,该数组用于转换传递到调试器然后返回到客户端的路径。

这允许用户将其符号链接目录转换为实际用于构建二进制文件的文件。
此外,这还可以用于远程调试,以及当程序构建后文件位置发生移动时。

示例:您需要一个fromto密钥:

module voltagems
Run Code Online (Sandbox Code Playgroud)